我想找到整个硬盘中的所有文件(.jpg,.png,.apk和其他几种格式),但这段代码无法正常工作......它的确如此:例如,如果在我的' D中:\'我有:1)图像文件' i1',2)文件夹' f1'它有图像文件和3)另一个文件夹' f2'它有图像文件和' f2'包含文件夹' f3'它有图像文件。它只执行' calcFile()'在f1和f2内的内容而不是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);
}
答案 0 :(得分:1)
您只是枚举根目录但没有子目录。而不是Directory.GetDirectories(s)
使用
foreach(string d in Directory.GetDirectories(s, "*", SearchOption.AllDirectories))
但请注意由于子目录中的链接导致的无限循环(请参阅SearchOption.AllDirectories上的MSDN)。
您应该了解用户访问权限。如果您没有特定目录的访问权限,则应在try...catch
部分周围添加GetFiles
(请参阅此question)。
答案 1 :(得分:1)
我根据您的代码创建了一个函数,该函数将递归搜索目录以查找与您的模式匹配的任何内容。您必须从基本目录的循环中调用它。
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);
}
}