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
MicrosoftMicrosoft.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");
- 주어진 파일 및 속성 이름에 대한 문자열로 원하는 확장 속성의 값을 반환합니다.
- 지정된 속성을 찾을 때까지만 반복합니다. 일부 샘플 코드처럼 모든 속성이 검색 될 때까지 반복하지 않습니다.
-
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; }