我在here之前问了一个非常相似的问题。但这是关于获取目录,这是关于文件。这些代码彼此有点不同。自从我一直试图将其转换为在我的旧问题上看起来像answer之后,我一直无法使其发挥作用。
string[] files = Directory.GetFiles(ScanPath, "*.*", System.IO.SearchOption.AllDirectories);
DateTime From = DateTime.Now.AddHours(-24);
DateTime To = DateTime.Now;
foreach (string name in files)
{
FileInfo file = new FileInfo(name);
string fullname = file.FullName;
if (file.LastWriteTime >= From & file.LastWriteTime <= To && file.Length >= ScanSize)
Console.WriteLine(file.FullName + " ; " + "last changed at " + " ; " + file.LastWriteTime.ToString());
}
我得到了与我在另一个问题中解释的相同的错误。因为我不知道在递归中将foreach
的代码放在何处。因为它不是枚举而是Directory.GetFiles()
。
错误发生在:
Directory.GetFiles(ScanPath, "*", SearchOption.AllDirectories);
因为这会立即获取目录的所有文件。但是如果我删除它,它只获取给定路径中的文件,而不包含子目录中的任何文件。所以我被告知应用递归。
我是系统的管理员,我打算在整个数据驱动器上运行它。 d:\
我希望这里有人知道一个很好的例子。
答案 0 :(得分:2)
您的应用无法访问某些文件夹,对于其他人,您可以使用以下代码:
void DiscoverDirs(string where, List<string> files, Func<FileInfo, bool> filter)
{
try
{
var di = new DirectoryInfo(where);
files.AddRange(di.EnumerateFiles().Where(filter).Select(x => x.FullName));
foreach (var dir in Directory.GetDirectories(where))
{
DiscoverDirs(dir, files, filter);
}
}
catch
{
// no access fo this dir, ignore
}
}
用法:
DateTime From = DateTime.Now.AddHours(-24);
DateTime To = DateTime.Now;
var ScanSize = 5*1024*1024;
var list = new List<string>();
DiscoverDirs(@"C:\", list,
file => file.LastWriteTime >= From & file.LastWriteTime <= To && file.Length >= ScanSize);
foreach (string name in list)
{
FileInfo file = new FileInfo(name);
string fullname = file.FullName;
Console.WriteLine(file.FullName + " ; " + "last changed at " + " ; " + file.LastWriteTime.ToString());
}
答案 1 :(得分:1)
访问某些系统目录时可能会出现“UnauthorizedAccessException”。导致问题的目录列表实际上只是重定向到其他目录的目录。 如果有帮助,可能是您可以试用以下代码 -
try
{
foreach (String file in Directory.GetFiles(directoryName, pattern, SearchOption.TopDirectoryOnly))
{
// do stuff
}
catch (UnauthorizedAccessException uae)
{
//handle
}
catch (Exception e)
{
//handle
}
<强>替代:强>
string[] directories = Directory.GetDirectories(ScanPath);
foreach (string directory in directories)
{
string[] filesinCurrentDirectory = Directory.GetFiles(directory, "*.*", System.IO.SearchOption.AllDirectories);
foreach (string file in filesinCurrentDirectory)
{
MessageBox.Show(file);
}
}