[c#] ‘확장’파일 속성 읽기 / 쓰기 (C #)

Windows 탐색기에서 볼 수있는 C #의 확장 파일 속성 (예 : 설명, 비트 전송률, 액세스 한 날짜, 범주 등)을 읽고 쓰는 방법을 찾으려고합니다. 이 작업을 수행하는 방법에 대한 아이디어가 있습니까? 편집 : 주로 비디오 파일 (AVI / DIVX / …)을 읽고 쓸 것입니다.



답변

VB에 열광하지 않는 사람들을 위해 여기에 C #이 있습니다.

참조 대화 상자의 COM 탭에서 Microsoft Shell 컨트롤 및 자동화 에 대한 참조를 추가해야합니다 .

public static void Main(string[] args)
{
    List<string> arrHeaders = new List<string>();

    Shell32.Shell shell = new Shell32.Shell();
    Shell32.Folder objFolder;

    objFolder = shell.NameSpace(@"C:\temp\testprop");

    for( int i = 0; i < short.MaxValue; i++ )
    {
        string header = objFolder.GetDetailsOf(null, i);
        if (String.IsNullOrEmpty(header))
            break;
        arrHeaders.Add(header);
    }

    foreach(Shell32.FolderItem2 item in objFolder.Items())
    {
        for (int i = 0; i < arrHeaders.Count; i++)
        {
            Console.WriteLine(
              $"{i}\t{arrHeaders[i]}: {objFolder.GetDetailsOf(item, i)}");
        }
    }
}


답변

ID3 리더를위한 CodeProject 기사 가 있습니다 . 다른 속성에 대한 자세한 정보가 있는 kixtart.org스레드 . 기본적으로, 당신은 호출 할 필요는 GetDetailsOf()방법 상의 폴더 에 대한 셸 개체를 shell32.dll.


답변

솔루션 2016

프로젝트에 다음 NuGet 패키지를 추가합니다.

  • Microsoft.WindowsAPICodePack-Shell Microsoft
  • Microsoft.WindowsAPICodePack-Core Microsoft

속성 읽기 및 쓰기

using Microsoft.WindowsAPICodePack.Shell;
using Microsoft.WindowsAPICodePack.Shell.PropertySystem;

string filePath = @"C:\temp\example.docx";
var file = ShellFile.FromFilePath(filePath);

// Read and Write:

string[] oldAuthors = file.Properties.System.Author.Value;
string oldTitle = file.Properties.System.Title.Value;

file.Properties.System.Author.Value = new string[] { "Author #1", "Author #2" };
file.Properties.System.Title.Value = "Example Title";

// Alternate way to Write:

ShellPropertyWriter propertyWriter =  file.Properties.GetPropertyWriter();
propertyWriter.WriteProperty(SystemProperties.System.Author, new string[] { "Author" });
propertyWriter.Close();

중대한:

파일은 지정된 특정 소프트웨어에서 만든 유효한 파일이어야합니다. 모든 파일 유형에는 특정 확장 파일 속성이 있으며 모두 쓰기 가능한 것은 아닙니다.

데스크톱에서 파일을 마우스 오른쪽 버튼으로 클릭하고 속성을 편집 할 수없는 경우 코드에서도 파일을 편집 할 수 없습니다.

예:

  • 바탕 화면에 txt 파일을 만들고 확장자를 docx로 바꿉니다. Author또는 Title속성을 편집 할 수 없습니다 .
  • Word로 열고 편집하고 저장하십시오. 이제 할 수 있습니다.

그래서 몇 가지를 사용하십시오 try catch

추가 항목 :
MSDN : 속성 처리기 구현


답변

VB.NET의이 샘플은 모든 확장 속성을 읽습니다.

Sub Main()
        Dim arrHeaders(35)

        Dim shell As New Shell32.Shell
        Dim objFolder As Shell32.Folder

        objFolder = shell.NameSpace("C:\tmp")

        For i = 0 To 34
            arrHeaders(i) = objFolder.GetDetailsOf(objFolder.Items, i)
        Next
        For Each strFileName In objfolder.Items
            For i = 0 To 34
                Console.WriteLine(i & vbTab & arrHeaders(i) & ": " & objfolder.GetDetailsOf(strFileName, i))
            Next
        Next

    End Sub

참조 대화 상자 의 COM 탭 에서 Microsoft Shell 컨트롤 및 자동화 에 대한 참조를 추가해야합니다 .


답변

이 스레드에 감사드립니다! exe의 파일 버전을 알아 내고 싶을 때 도움이되었습니다. 그러나 확장 속성이라고하는 마지막 부분을 직접 파악해야했습니다.

Windows 탐색기에서 exe (또는 dll) 파일의 속성을 열면 버전 탭과 해당 파일의 확장 속성보기가 나타납니다. 나는 그 가치 중 하나에 접근하고 싶었다.

이에 대한 해결책은 속성 인덱서 FolderItem.ExtendedProperty이며 속성 이름에 모든 공백을 삭제하면 값을 얻을 수 있습니다. 예를 들어 파일 버전은 FileVersion이되며 거기에 있습니다.

이것이 다른 사람에게 도움이되기를 바랍니다.이 정보를이 스레드에 추가 할 것이라고 생각했습니다. 건배!


답변

GetDetailsOf()방법-폴더의 항목에 대한 세부 정보를 검색합니다. 예를 들어 크기, 유형 또는 마지막 수정 시간입니다. 파일 속성은 Windows-OS버전 에 따라 다를 수 있습니다 .

List<string> arrHeaders = new List<string>();

 Shell shell = new ShellClass();
 Folder rFolder = shell.NameSpace(_rootPath);
 FolderItem rFiles = rFolder.ParseName(filename);

 for (int i = 0; i < short.MaxValue; i++)
 {
      string value = rFolder.GetDetailsOf(rFiles, i).Trim();
      arrHeaders.Add(value);
 }


답변

  • 이 스레드와 다른 곳에서 여러 솔루션을 살펴본 후 다음 코드가 함께 작성되었습니다. 이것은 단지 속성을 읽기위한 것입니다.
  • Shell32.FolderItem2.ExtendedProperty 함수가 작동하도록 할 수 없었습니다. 문자열 값을 가져와 해당 속성에 대한 올바른 값과 유형을 반환해야합니다 … 이것은 항상 저에게 null이었고 개발자 참조 리소스는 매우 얇았습니다.
  • WindowsApiCodePack는 우리에게 아래의 코드를 제공하는 마이크로 소프트에 의해 포기 된 것으로 보인다.

사용하다:

string propertyValue = GetExtendedFileProperty("c:\\temp\\FileNameYouWant.ext","PropertyYouWant");
  1. 주어진 파일 및 속성 이름에 대한 문자열로 원하는 확장 속성의 값을 반환합니다.
  2. 지정된 속성을 찾을 때까지만 반복합니다. 일부 샘플 코드처럼 모든 속성이 검색 될 때까지 반복하지 않습니다.
  3. Windows Server 2008과 같은 Windows 버전에서 작동 합니다. Shell32 개체를 정상적으로 만들려고하면 ” ‘System .__ ComObject’유형의 COM 개체를 인터페이스 유형 ‘Shell32.Shell’로 캐스팅 할 수 없습니다.” 라는 오류 메시지가 표시 됩니다.

    public static string GetExtendedFileProperty(string filePath, string propertyName)
    {
        string value = string.Empty;
        string baseFolder = Path.GetDirectoryName(filePath);
        string fileName = Path.GetFileName(filePath);
    
        //Method to load and execute the Shell object for Windows server 8 environment otherwise you get "Unable to cast COM object of type 'System.__ComObject' to interface type 'Shell32.Shell'"
        Type shellAppType = Type.GetTypeFromProgID("Shell.Application");
        Object shell = Activator.CreateInstance(shellAppType);
        Shell32.Folder shellFolder = (Shell32.Folder)shellAppType.InvokeMember("NameSpace", System.Reflection.BindingFlags.InvokeMethod, null, shell, new object[] { baseFolder });
    
        //Parsename will find the specific file I'm looking for in the Shell32.Folder object
        Shell32.FolderItem folderitem = shellFolder.ParseName(fileName);
        if (folderitem != null)
        {
            for (int i = 0; i < short.MaxValue; i++)
            {
                //Get the property name for property index i
                string property = shellFolder.GetDetailsOf(null, i);
    
                //Will be empty when all possible properties has been looped through, break out of loop
                if (String.IsNullOrEmpty(property)) break;
    
                //Skip to next property if this is not the specified property
                if (property != propertyName) continue;
    
                //Read value of property
                value = shellFolder.GetDetailsOf(folderitem, i);
            }
        }
        //returns string.Empty if no value was found for the specified property
        return value;
    }