2010-03-10 18 views

Trả lời

83

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); 
} 
+0

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

+12

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); ** –

+5

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); –

8

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).

9
// check whether a file is hidden 
bool isHidden = ((File.GetAttributes(filePath) & FileAttributes.Hidden) == FileAttributes.Hidden); 
+0

Điều này hữu ích khi linq không có sẵn – JDandChips

+2

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

+0

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

1

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

1

Một luật dòng:

FileInfo[] tmpFiles = tempDir.GetFiles().Where(file => 
      (file.Attributes & FileAttributes.Hidden) == 0).ToArray(); 
1

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.

1

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);); 
-1
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:

  1. Tạo bool mà trả về true khi chuỗi chứa 'Hidden' ---- static bool IsHidden(string p){return p.Contains("Hidden");}

  2. get thông tin thư mục ---- DirectoryInfo directory = new DirectoryInfo(@"C:\temp");

  3. get thông tin tập tin từ thư mục mảng ---- FileInfo[] files = directory.GetFiles();

  4. 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()));

+1

Bạn muốn giải thích điều này – Ctznkane525

+0

mã này để loại trừ các tập tin ẩn –

+0

nếu bạn (Ctznkane525) nghi ngờ kiểm tra mã này và trả lời tôi là đúng hay không –

Các vấn đề liên quan