Directory.GetFiles()
返回所有文件,即使那些标记为隐藏的文件。有没有办法获得排除隐藏文件的文件列表?C# - 获取不包含隐藏文件的文件列表
回答
这应该为你工作:
DirectoryInfo directory = new DirectoryInfo(@"C:\temp");
FileInfo[] files = directory.GetFiles();
var filtered = files.Where(f => !f.Attributes.HasFlag(FileAttributes.Hidden));
foreach (var f in filtered)
{
Debug.WriteLine(f);
}
使用.NET 4.0和Directory.EnumerateDirectories,你可以使用此结构:
var hiddenFilesQuery = from file in Directory.EnumerateDirectories(@"c:\temp")
let info = new FileInfo(file)
where (info.Attributes & FileAttributes.Hidden) == 0
select file;
这是基本相同对方的回答,除了Directory.EnumerateDirectories有点懒惰。但是,如果列举所有内容,这并不是很有用。
(让这里有查询一个,但更可readeable)。
// check whether a file is hidden
bool isHidden = ((File.GetAttributes(filePath) & FileAttributes.Hidden) == FileAttributes.Hidden);
在linq不可用的情况下这很有用 – JDandChips 2012-11-30 10:47:21
简单的解决方案可以很优雅 - 我喜欢当人们展示解决方案时不显示Linq – Kairan 2013-11-16 01:38:23
或者等价地,File.GetAttributes(filePath).HasFlag(FileAttributes.Hidden)如果您愿意性能损失较小。 – Warty 2014-11-12 23:39:52
如果使用用途:
var filtered = files.Select(f => f) .Where(f => (f.Attributes & FileAttributes.Hidden) == 0);
这只是没有找到隐藏的文件,所以你可以使用:
var filtered = files.Select(f => f) .Where(f => (f.Attributes & FileAttributes.Hidden) == FileAttributes.Hidden);
这仅仅是阅读隐藏的f ILE
一行代码:
FileInfo[] tmpFiles = tempDir.GetFiles().Where(file =>
(file.Attributes & FileAttributes.Hidden) == 0).ToArray();
如果你使用SearchOption.TopDirectoryOnly - 那么它是比较简单的,但是 - 如果你要递归列出所有文件使用SearchOption.AllDirectories它变得更加复杂。如果你可以GetFiles,然后过滤掉只读,但不幸的是它不会用于标记为隐藏的目录。该文件夹下的文件也被列出,但与目录不同,它们不会被隐藏。
您也可以使用GetDirectories,但是又不能 - 使用SearchOption.AllDirectories递归列出所有内容,因为它还列出了位于隐藏文件夹下的文件夹,但这些文件夹没有启用隐藏属性。
这是至少对于乌龟svn .svn隐藏文件夹的情况。它包含很多不隐藏的文件夹,但.svn是隐藏的。最后,我写的功能,看起来像这样:
SearchOption sopt = SearchOption.AllDirectories;
List<String> listFiles = new List<string>();
List<DirectoryInfo> dirs2scan = new List<DirectoryInfo>();
dirs2scan.Add(new DirectoryInfo(fromPath));
for(; dirs2scan.Count != 0;)
{
int scanIndex = dirs2scan.Count - 1; // Try to preserve somehow alphabetic order which GetFiles returns
// by scanning though last directory.
FileInfo[] filesInfo = dirs2scan[scanIndex].GetFiles(pattern, SearchOption.TopDirectoryOnly);
foreach (FileInfo fi in filesInfo)
{
if (bNoHidden && fi.Attributes.HasFlag(FileAttributes.Hidden))
continue;
listFiles.Add(fi.FullName);
}
if(sopt != SearchOption.AllDirectories)
break;
foreach (DirectoryInfo dir in dirs2scan[scanIndex].GetDirectories("*", SearchOption.TopDirectoryOnly))
{
if (bNoHidden && dir.Attributes.HasFlag(FileAttributes.Hidden))
continue;
dirs2scan.Add(dir);
}
dirs2scan.RemoveAt(scanIndex);
}
SOPT可以使用参数的功能,如果有必要,或者如果不需要删除。
我真的很喜欢传递一个函数参数给一个方法,它做我想做的。我有一个SearchDirectory方法,形成对大多数呼叫的基础上,我使用:
private void SearchDirectory(DirectoryInfo startDirectory,
string pattern,
Action<FileInfo> act)
{
foreach (var file in startDirectory.GetFiles(pattern))
act(file);
foreach (var directory in startDirectory.GetDirectories())
SearchDirectory(directory, pattern, act);
}
private List<FileInfo> SearchDirectory(DirectoryInfo startDirectory,
string pattern,
Func<FileInfo, bool> isWanted)
{
var lst = new List<FileInfo>();
SearchDirectory(startDirectory,
pattern,
(fi) => { if (isWanted(fi)) lst.Add(fi); });
return lst;
}
然后你可以使用所列的其他解决方案写一个是否隐藏函数,它接受一个FileInfo的,如果是这样,则返回true:
private bool IsHiddenDirectory(DirectoryInfo d) {
if (d == null) return false;
if (d.Attributes.HasFlag(FileAttributes.Hidden))) return true;
if (d.Parent == null) return false;
return IsHiddenDirectory(d.Parent);
}
private bool IsHidden(FileInfo fi) {
if ((fi.Attributes & FileAttributes.Hidden) != 0) return true;
// If you're worried about parent directories hidden:
return IsHiddenDirectory(fi.Directory);
// otherwise:
return false;
}
然后,我可以很容易地把它称为另一种方法:
var files = SearchDirectory(new DirectoryInfo("C:\temp\"),
"*.xml",
(fi) => { return !IsHidden(fi););
static bool IsHidden(string p)
{
return p.Contains("Hidden");
}
DirectoryInfo directory = new DirectoryInfo(@"C:\temp");
FileInfo[] files = directory.GetFiles();
var filtered = files.Where(f => !IsHidden(File.GetAttributes(f).ToString()));
foreach (var f in filtered)
{
Debug.WriteLine(f);
}
个步骤:
创建布尔返回true当字符串包含 '隐藏' ----
static bool IsHidden(string p){return p.Contains("Hidden");}
获取目录信息----从目录
DirectoryInfo directory = new DirectoryInfo(@"C:\temp");
获取文件信息数组----
FileInfo[] files = directory.GetFiles();
获取文件信息属性并将其转换为文件信息数组中的字符串,并检查它是否包含“隐藏”或不包含的内容----
var filtered = files.Where(f=>!IsHidden(File.GetAttributes(f).ToString()));
你想解释这 – Ctznkane525 2018-01-30 21:03:35
此代码用于排除隐藏文件 – 2018-01-30 22:24:01
如果你(Ctznkane525)有任何疑问 检查此代码并回复我这是正确与否 – 2018-01-30 22:28:24
- 1. 如何使with_fileglob包含隐藏文件?
- 2. 获取压缩文件中包含的文件的文件列表
- 3. 不包含模式的列表文件
- 4. 使用jar命令在war文件中包含隐藏文件
- 5. 包含所有文件信息的C++文件列表
- 6. android:从隐藏目录中获取文件列表
- 7. 获取项目中每个文件包含的所有头文件的列表
- 8. 蝙蝠文件隐藏/取消隐藏
- 9. 获取包含lua文件的路径
- 10. 包含文件C
- 11. C#列出没有隐藏文件的文件(Plus列表选项)
- 12. 隐藏文件夹C#
- 13. Python:获取包含特定文件扩展名的文件夹
- 14. 删除链接和取消隐藏隐藏文件c#
- 15. 获取包含主文件的.class文件的目录路径
- 16. 获取包含在项目中的文件的文件路径
- 17. 在VBA中查找包含〜使用Dir()的隐藏文件或系统文件
- 18. Outlook ContactItem:获取包含文件夹?
- 19. Ajax使用jQuery获取隐藏表单的PHP文件
- 20. 提取列值包含在列表中的文件中的行?
- 21. 获取文件列表
- 22. 动态获取包含文件的源文件名:ServerVariables(“SCRIPT_NAME”)
- 23. 使用包含文件获取文件的路径/名称?
- 24. 获取源JSP文件的文件名(即使包含)
- 25. Excel文件包含无法删除的无效隐藏字符
- 26. C++包含头文件
- 27. C++头文件包含
- 28. C++ Builder:包含JAR文件
- 29. xcode c包含文件
- 30. 在C++中包含文件
据我了解C#4.0应该使这种更快,更容易;-) – Dested 2010-03-10 15:55:40
您可以在一行做到这一点,没有选择** var中的文件=新的DirectoryInfo(@“C:\ “).GetFiles()。其中(x =>(x.Attributes&FileAttributes.Hidden)== 0); ** – 2010-03-10 16:00:17
或甚至只是使用目录类(通过8个字符减少@astanders解决方案) var files = Directory.GetFiles(@“c:\”)。其中(x =>(x.Attributes&FileAttributes.Hidden)== 0); – 2010-03-10 16:24:07