c# 在硬盘上查找具有某些扩展名的文件
c# finding files with some extension on hard disk
我想找到整个硬盘驱动器中的所有文件(.jpg、.png、.apk 和其他一些格式)但是这段代码不起作用..它所做的只是:例如如果在我的 'D:\' 驱动器 我有:1) 一个图像文件 'i1',2) 一个有图像文件的文件夹 'f1' 和 3) 另一个有图像文件的文件夹 'f2' 和 'f2'包含具有图像文件的文件夹 'f3'。它仅对 f1 和 f2 内的内容执行 'calcFile()',但不对 f3 和 i1 的内容执行,所有其他分区也会发生同样的情况。这里有什么问题?任何帮助表示赞赏。
我希望你明白发生了什么,因为这是我解释我的情况的最简单方法,如果需要更多信息,请告诉我。谢谢:)
public void calcDirectory(string token)
{
var validExtensions = new[]
{
".jpg", ".png", ".apk"
};
foreach (string s in Directory.GetLogicalDrives())
{
DriveInfo driveInfo = new DriveInfo(s);
if (driveInfo.IsReady)
{
foreach (string d in Directory.GetDirectories(s))
{
FileAttributes attrs1 = File.GetAttributes(d);
if (!attrs1.HasFlag(FileAttributes.ReparsePoint))
{
if (!attrs1.HasFlag(FileAttributes.System))
{
string[] allFilesInDir = Directory.GetFiles(d);
for (int i = 0; i < allFilesInDir.Length; i++)
{
string file = allFilesInDir[i];
string extension = Path.GetExtension(file);
if (validExtensions.Contains(extension))
{
string p = Path.GetFullPath(file);
FileAttributes attrs = File.GetAttributes(p);
if (attrs.HasFlag(FileAttributes.ReadOnly))
{
File.SetAttributes(p, attrs & ~FileAttributes.ReadOnly);
calcFile(file, token);
}
else
{
calcFile(file, token);
}
}
}
}
}
}
}
}
}
我在这里调用 calcDirectory()
public void start()
{
string token = File.ReadAllText(tokencalcalculated);
calcDirectory(token);
}
您只枚举了根目录,没有枚举子目录。而不是 Directory.GetDirectories(s)
使用
foreach(string d in Directory.GetDirectories(s, "*", SearchOption.AllDirectories))
但要注意由于子目录中的链接而导致的无限循环(请参阅 SearchOption.AllDirectories 上的 MSDN)。
并且您应该了解用户访问权限。你应该在你的 GetFiles
部分周围放置一个 try...catch
以防你没有特定目录的访问权限(参见这个 question)。
我根据您的代码创建了一个函数,该函数将递归搜索目录以查找与您的模式匹配的任何内容。您必须从基本目录的循环中调用它。
public static void crawlDirectory(string token,string directory)
{
if (string.IsNullOrEmpty(directory)) return;
var validExtensions = new[]
{
".jpg", ".png", ".apk"
};
foreach (string d in Directory.GetDirectories(directory))
{
FileAttributes attrs1 = File.GetAttributes(d);
if (!attrs1.HasFlag(FileAttributes.ReparsePoint) && !attrs1.HasFlag(FileAttributes.System))
{
string[] allFilesInDir = Directory.GetFiles(d);
for (int i = 0; i < allFilesInDir.Length; i++)
{
string file = allFilesInDir[i];
string extension = Path.GetExtension(file);
if (validExtensions.Contains(extension))
{
string p = Path.GetFullPath(file);
FileAttributes attrs = File.GetAttributes(p);
if (attrs.HasFlag(FileAttributes.ReadOnly))
{
File.SetAttributes(p, attrs & ~FileAttributes.ReadOnly);
calcFile(file, token);
}
else
{
calcFile(file, token);
}
}
}
}
crawlDirectory(d, token);
}
}
我想找到整个硬盘驱动器中的所有文件(.jpg、.png、.apk 和其他一些格式)但是这段代码不起作用..它所做的只是:例如如果在我的 'D:\' 驱动器 我有:1) 一个图像文件 'i1',2) 一个有图像文件的文件夹 'f1' 和 3) 另一个有图像文件的文件夹 'f2' 和 'f2'包含具有图像文件的文件夹 'f3'。它仅对 f1 和 f2 内的内容执行 'calcFile()',但不对 f3 和 i1 的内容执行,所有其他分区也会发生同样的情况。这里有什么问题?任何帮助表示赞赏。 我希望你明白发生了什么,因为这是我解释我的情况的最简单方法,如果需要更多信息,请告诉我。谢谢:)
public void calcDirectory(string token)
{
var validExtensions = new[]
{
".jpg", ".png", ".apk"
};
foreach (string s in Directory.GetLogicalDrives())
{
DriveInfo driveInfo = new DriveInfo(s);
if (driveInfo.IsReady)
{
foreach (string d in Directory.GetDirectories(s))
{
FileAttributes attrs1 = File.GetAttributes(d);
if (!attrs1.HasFlag(FileAttributes.ReparsePoint))
{
if (!attrs1.HasFlag(FileAttributes.System))
{
string[] allFilesInDir = Directory.GetFiles(d);
for (int i = 0; i < allFilesInDir.Length; i++)
{
string file = allFilesInDir[i];
string extension = Path.GetExtension(file);
if (validExtensions.Contains(extension))
{
string p = Path.GetFullPath(file);
FileAttributes attrs = File.GetAttributes(p);
if (attrs.HasFlag(FileAttributes.ReadOnly))
{
File.SetAttributes(p, attrs & ~FileAttributes.ReadOnly);
calcFile(file, token);
}
else
{
calcFile(file, token);
}
}
}
}
}
}
}
}
}
我在这里调用 calcDirectory()
public void start()
{
string token = File.ReadAllText(tokencalcalculated);
calcDirectory(token);
}
您只枚举了根目录,没有枚举子目录。而不是 Directory.GetDirectories(s)
使用
foreach(string d in Directory.GetDirectories(s, "*", SearchOption.AllDirectories))
但要注意由于子目录中的链接而导致的无限循环(请参阅 SearchOption.AllDirectories 上的 MSDN)。
并且您应该了解用户访问权限。你应该在你的 GetFiles
部分周围放置一个 try...catch
以防你没有特定目录的访问权限(参见这个 question)。
我根据您的代码创建了一个函数,该函数将递归搜索目录以查找与您的模式匹配的任何内容。您必须从基本目录的循环中调用它。
public static void crawlDirectory(string token,string directory)
{
if (string.IsNullOrEmpty(directory)) return;
var validExtensions = new[]
{
".jpg", ".png", ".apk"
};
foreach (string d in Directory.GetDirectories(directory))
{
FileAttributes attrs1 = File.GetAttributes(d);
if (!attrs1.HasFlag(FileAttributes.ReparsePoint) && !attrs1.HasFlag(FileAttributes.System))
{
string[] allFilesInDir = Directory.GetFiles(d);
for (int i = 0; i < allFilesInDir.Length; i++)
{
string file = allFilesInDir[i];
string extension = Path.GetExtension(file);
if (validExtensions.Contains(extension))
{
string p = Path.GetFullPath(file);
FileAttributes attrs = File.GetAttributes(p);
if (attrs.HasFlag(FileAttributes.ReadOnly))
{
File.SetAttributes(p, attrs & ~FileAttributes.ReadOnly);
calcFile(file, token);
}
else
{
calcFile(file, token);
}
}
}
}
crawlDirectory(d, token);
}
}