我想创建一个目录中所有文件的列表,除了隐藏的fies和目录中隐藏文件夹中的文件。我用过这种方法,
inkGrid0
但是上面的方法会在隐藏文件夹中返回文件。如果没有递归迭代目录,还有其他方法吗?
答案 0 :(得分:6)
这是因为隐藏子文件夹中的文件未被隐藏。 要检查这一点,你必须递归地走到每个文件夹&检查文件夹属性。
示例功能:
private static IList<FileInfo> getNonHidden(DirectoryInfo baseDirectory)
{
var fileInfos = new List<System.IO.FileInfo>();
fileInfos.AddRange(baseDirectory.GetFiles("*.*", SearchOption.TopDirectoryOnly).Where(w => (w.Attributes & FileAttributes.Hidden) == 0));
foreach (var directory in baseDirectory.GetDirectories("*.*", SearchOption.TopDirectoryOnly).Where(w => (w.Attributes & FileAttributes.Hidden) == 0))
fileInfos.AddRange(getNonHiddenFiles(directory));
return fileInfos;
}
使用方法:
var path = @"c:\temp\123";
var result = getNonHidden(new DirectoryInfo(path));
答案 1 :(得分:1)
试试这样:
foreach (DirectoryInfo Dir in Directory.GetDirectories(directorypath))
{
if (!Dir.Attributes.HasFlag(FileAttributes.Hidden))
{
}
}
答案 2 :(得分:1)
没有&#34;手动迭代的一种方式&#34;将是以下内容:
var dirInfo = new DirectoryInfo(path);
var hiddenFolders = dirInfo.GetDirectories("*", SearchOption.AllDirectories)
.Where(d => (d.Attributes & FileAttributes.Hidden) != 0)
.Select(d => d.FullName);
var files = dirInfo.GetFiles("*.*", SearchOption.AllDirectories)
.Where(f => (f.Attributes & FileAttributes.Hidden) == 0 &&
!hiddenFolders.Any(d => f.FullName.StartsWith(d)));
但这将迭代整个目录树两次,并且.Any
- 每个文件的开销=&gt;使用@ Catburry的解决方案,因为它具有更好的性能并且更容易维护IMO ...
答案 3 :(得分:-1)
您可以尝试下面的代码:
var x = new DirectoryInfo(@"D://Priyank Sheth/Projects/").GetFiles("*.*", SearchOption.AllDirectories)
.Where(f => (f.Directory.Attributes & FileAttributes.Hidden) == 0 && (f.Attributes & FileAttributes.Hidden) == 0);
我没有尝试过,但如果它不起作用,请告诉我。