Directory.GetFiles()
trả về tất cả các tệp, ngay cả những tệp được đánh dấu là ẩn. Có cách nào để lấy danh sách các tệp không bao gồm các tệp bị ẩn không?C# - Lấy danh sách các tệp trừ những tệp bị ẩn
Trả lời
này nên làm việc cho bạn:
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);
}
Sử dụng .NET 4.0 và Directory.EnumerateDirectories, bạn có thể sử dụng cấu trúc này:
var hiddenFilesQuery = from file in Directory.EnumerateDirectories(@"c:\temp")
let info = new FileInfo(file)
where (info.Attributes & FileAttributes.Hidden) == 0
select file;
này về cơ bản là giống như câu trả lời khác, ngoại trừ Directory.EnumerateDirectories hơi lười hơn một chút. Điều này không phải là rất hữu ích nếu bạn liệt kê tất cả mọi thứ, mặc dù.
(Sự cho phép ở đây là có truy vấn nhưng dễ đọc hơn).
// check whether a file is hidden
bool isHidden = ((File.GetAttributes(filePath) & FileAttributes.Hidden) == FileAttributes.Hidden);
Điều này hữu ích khi linq không có sẵn – JDandChips
Các giải pháp đơn giản có thể thanh lịch - Tôi thích khi mọi người hiển thị các giải pháp mà không hiển thị LINQ – Kairan
Hoặc tương đương, File.GetAttributes (filePath) .HasFlag (FileAttributes.Hidden) nếu bạn sẵn sàng mất hiệu suất nhỏ. – Warty
nếu sử dụng sử dụng:
var filtered = files.Select(f => f) .Where(f => (f.Attributes & FileAttributes.Hidden) == 0);
chỉ này tìm không có tập tin ẩn, vì vậy bạn có thể sử dụng:
var filtered = files.Select(f => f) .Where(f => (f.Attributes & FileAttributes.Hidden) == FileAttributes.Hidden);
đây chỉ là để đọc f ẩn ile
Một luật dòng:
FileInfo[] tmpFiles = tempDir.GetFiles().Where(file =>
(file.Attributes & FileAttributes.Hidden) == 0).ToArray();
Nếu bạn đang sử dụng SearchOption.TopDirectoryOnly - thì đó là tương đối đơn giản, tuy nhiên - nó trở nên phức tạp hơn rất nhiều nếu bạn muốn liệt kê tất cả các file một cách đệ quy sử dụng SearchOption.AllDirectories . Nếu bạn có thể GetFiles và sau đó lọc ra chỉ đọc, nhưng tiếc là nó sẽ không hoạt động với các thư mục được đánh dấu là ẩn. Các tệp trong thư mục đó cũng được liệt kê, nhưng chúng không bị ẩn không giống như thư mục.
Bạn cũng có thể sử dụng GetDirectories, nhưng lại không thể liệt kê mọi thứ đệ quy bằng SearchOption.AllDirectories, vì nó cũng liệt kê các thư mục nằm trong thư mục ẩn, nhưng những thư mục đó không có thuộc tính ẩn được bật.
Đây là trường hợp ít nhất đối với thư mục ẩn svn .vn của Tortoise. Nó chứa rất nhiều thư mục không bị ẩn, nhưng .svn bị ẩn. Cuối cùng tôi đã viết chức năng như sau:
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 có thể được sử dụng thông số trong chức năng nếu cần hoặc xóa nếu không cần thiết.
Tôi thực sự thích chuyển một tham số hàm tới phương thức thực hiện những gì tôi muốn.Tôi có một phương pháp SearchDirectory, đã tạo cơ sở cho hầu hết các cuộc gọi tôi sử dụng:
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;
}
Sau đó, bạn có thể sử dụng các giải pháp khác được liệt kê để viết một chức năng Được ẩn mà phải mất một FileInfo duy nhất, và trả về true nếu như vậy:
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;
}
Sau đó, tôi có thể gọi nó trong phương pháp khác khá dễ dàng:
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);
}
bước:
Tạo bool mà trả về true khi chuỗi chứa 'Hidden' ----
static bool IsHidden(string p){return p.Contains("Hidden");}
get thông tin thư mục ----
DirectoryInfo directory = new DirectoryInfo(@"C:\temp");
get thông tin tập tin từ thư mục mảng ----
FileInfo[] files = directory.GetFiles();
nhận thông tin tệp Thuộc tính và chuyển đổi thành chuỗi từ mảng thông tin tệp và chọn nó có chứa 'Ẩn' hay không ----
var filtered = files.Where(f=>!IsHidden(File.GetAttributes(f).ToString()));
Bạn muốn giải thích điều này – Ctznkane525
mã này để loại trừ các tập tin ẩn –
nếu bạn (Ctznkane525) nghi ngờ kiểm tra mã này và trả lời tôi là đúng hay không –
- 1. Lấy danh sách tệp qua FTP
- 2. C# LINQ String [] Danh sách trừ từ String [] Danh sách
- 3. Cách lấy danh sách các tệp có lỗi trong PhpStorm
- 4. Lấy danh sách các tệp trong sass/compass
- 5. Có thể lấy danh sách các tệp đã thêm hoặc bị xóa khỏi Subversion không?
- 6. Xóa các tệp bị ẩn đệ quy
- 7. Danh sách các loại ẩn danh?
- 8. Tại sao tìm thấy. -not -name ". *" không loại trừ các tệp bị ẩn?
- 9. Danh sách Php CHỈ các tệp trong kho lưu trữ zip (loại trừ các thư mục)
- 10. Lấy danh sách tệp từ thư mục SkyDrive (Windows Phone)
- 11. tìm các tệp không có trong danh sách
- 12. Có thể lấy danh sách các tệp trong thư mục của trang web không? Làm sao?
- 13. Nhận danh sách đệ quy của các tệp svn: ignore'd
- 14. Lấy danh sách tệp lớn, sắp xếp theo thời gian tệp theo * mili giây *
- 15. C# lấy danh sách từ một trường trong danh sách
- 16. Danh sách các tệp đã được kiểm tra bởi những người khác trong Perforce
- 17. cp -r không có tệp bị ẩn
- 18. Danh sách GIT của các tệp mới/đã sửa đổi/bị xóa
- 19. Lấy danh sách tất cả các tệp trong thư mục (đệ quy)
- 20. Cách lấy danh sách các tệp bị ảnh hưởng từ một bản sửa đổi cụ thể trong Mercurial
- 21. PowerShell lấy danh sách các máy mạng
- 22. coverage.py: loại trừ các tệp
- 23. Danh sách tất cả các tệp đang mở
- 24. cách xóa tất cả các tệp trừ ba tệp mới nhất trong một thư mục
- 25. Ẩn các tệp ẩn trong Windows
- 26. danh sách tệp đệ quy trong Ruby
- 27. Loại trừ các tệp từ TFS qua tệp dự án
- 28. Lấy danh sách các ổ đĩa logic
- 29. Làm cách nào để đếm các phần tử danh sách không bị ẩn?
- 30. Cách lấy danh sách các tệp/thư mục của url thư mục trong java?
Từ những gì tôi hiểu C# 4.0 nên làm này nhanh hơn và dễ dàng hơn ;-) – Dested
Bạn có thể làm điều này trong một dòng duy nhất, mà không cần các file var ** CHỌN = new DirectoryInfo (@ "C: \ Ở đâu (x => (x.Attributes & FileAttributes.Hidden) == 0); ** –
Hoặc thậm chí chỉ cần sử dụng lớp thư mục (giảm giải pháp @astanders 8 ký tự) var files = Directory.GetFiles (@ "c: \"). Ở đâu (x => (x.Attributes & FileAttributes.Hidden) == 0); –