我写了一个函数,它允许我获取任何文件的所有属性 此功能甚至适用于文件夹。
但我提到没有" Windows API Code Pack"并使用" Shell32"你可以及早获得任何文件的308个属性。
Shell32.Shell shell = new Shell32.Shell();
shell.NameSpace(@"C:\_test\clip.mp4").GetDetailsOf(null, i); // i = 0...320
然而,使用" Windows API Code Pack" " DefaultPropertyCollection"中只有56个属性。集合。
例如,没有"评级"这个系列中的财产
然后我意识到,而不是" shellFile.Properties.DefaultPropertyCollection"我应该研究一下" shellFile.Properties.System"
private void GetFileDatails(string path)
{
var shellFile = ShellFile.FromParsingName(path);
textBox1.Text += shellFile.Properties.DefaultPropertyCollection.Count + "\r\n";
shellFile.Properties.DefaultPropertyCollection.ToList().ForEach(el => textBox1.Text += el.Description.CanonicalName + " - " + el.Description.DisplayName + " = " + el.ValueAsObject + "\r\n");
textBox1.Text += "\r\n" + shellFile.Properties.System.Rating;
}
是的,这是真的!
但是如何使用这个" shellFile.Properties.System"?来获取所有其他200多个文件的属性?
它甚至不是收藏!它不是IEnumerable!你不能使用foreach循环!
你应该总是输入
"shellFile.Properties.System.*" //you should type this line more then 100 times
无论如何我也无法获得root驱动器的详细信息! 使用" Windows API Code Pack"或使用" Shell32" 我无法得到" DriveFormat"任何分区! 请!告诉我如何获得" C Drive"细节?
答案 0 :(得分:-1)
您可以使用Reflection枚举所有属性并获取其值如下
static void Main(string[] args)
{
string fileName = Path.Combine(Directory.GetCurrentDirectory(), "All Polished.mp4");
ShellObject shellObject= ShellObject.FromParsingName(fileName);
PropertyInfo[] propertyInfos = shellObject.Properties.System.GetType().GetProperties();
foreach (var propertyInfo in propertyInfos)
{
object value = propertyInfo.GetValue(shellObject.Properties.System, null);
if (value is ShellProperty<int?>)
{
var nullableIntValue = (value as ShellProperty<int?>).Value;
Console.WriteLine($"{propertyInfo.Name} - {nullableIntValue}");
}
else if (value is ShellProperty<ulong?>)
{
var nullableLongValue =
(value as ShellProperty<ulong?>).Value;
Console.WriteLine($"{propertyInfo.Name} - {nullableLongValue}");
}
else if (value is ShellProperty<string>)
{
var stringValue =
(value as ShellProperty<string>).Value;
Console.WriteLine($"{propertyInfo.Name} - {stringValue}");
}
else if (value is ShellProperty<object>)
{
var objectValue =
(value as ShellProperty<object>).Value;
Console.WriteLine($"{propertyInfo.Name} - {objectValue}");
}
else
{
Console.WriteLine($"{propertyInfo.Name} - Dummy value");
}
}
Console.ReadLine();
}