2009-05-13 4 views
0

この問題は、File Lockという名前のツールを使用してディレクトリ内のファイルを非表示にすると発生します。私はWindowsエクスプローラで見ることができないので、これは普通の隠れ家ではありません。 コード:Directory.GetFiles()が異常な戻り値を返します

string[] textFiles = Directory.GetFiles(@"c:\mydir") 
//0 files returned 

string[] textFiles = Directory.GetFiles(@"c:\mydir", "*.txt") 
//1 file returned: "c:\mydir\." 
File.Exists(textFiles[0]) 
//false 

がどのように第二の機能は、返すことができます "C:\ MYDIR \"ファイル?私は問題を解決するために存在しないすべてのファイルを削除することができますが、なぜ私は "。"最初の場所にファイル。

答えて

3

ファイルロックツールの経験はありませんが、FindFirstFile WinAPI関数をフックして、一部のファイルをリストから保護することができます(.NET Directory.GetFiles()関数で使用されます)。そして、このフックは少し書くことができます...バグ:)

あなたはツールを無効にしてテストをやり直してください。
ほとんどの場合、問題を解決します。
同じ結果が得られたら、Directory.GetFiles()を非難してください。

+0

それはツールなしで正常に動作します。 ) – Carra

+0

ファイルロックツールのサポートにこのトピックへのリンクを送信すると、テスターをもっと幸せにすることができます:) – Rageous

0

"。"現在のディレクトリを参照します。試してください:

Directory.Exists(textFiles[0]); 

実際に見てください。

なぜ2番目のオーバーロードでエントリが返され、最初のオーバーロードが返されないのですか、わかりません。

2

もう少し調査:

  • C:\Test\は、通常のディレクトリ
  • C:\Test\text.txtでは、通常のテキストファイルです。
  • C:\Text\text2.txtロック
  • ファイルによって隠されたテキストファイル

次のコードで...

using System; 
using System.IO; 

public static class GetFilesTest { 
    public static void Main() { 
    int counter = 0; 
    DirectoryInfo dir = new DirectoryInfo(@"C:\Test"); 
    foreach (FileSystemInfo fsi in dir.GetFileSystemInfos("*.txt")) { 
     Console.WriteLine("########### FileSystemInfo {0} ###########", ++counter); 
     Console.WriteLine("fsi: {0}", fsi); 
     Console.WriteLine("Exists: {0}", fsi.Exists); 
     Console.WriteLine("FullName: {0}", fsi.FullName); 
     Console.WriteLine("Name: {0}", fsi.Name); 
     Console.WriteLine("Extension: {0}", fsi.Extension); 
     Console.WriteLine("Attributes: {0}", fsi.Attributes); 
    } 

    counter = 0; 
    string[] files = {@"C:\Test\test.txt", @"C:\Test\test2.txt"}; 
    foreach(string file in files) { 
     FileSystemInfo fi = new FileInfo(file); 
     Console.WriteLine("########### FileInfo {0} ###########", ++counter); 
     Console.WriteLine("fi: {0}", fi); 
     Console.WriteLine("Exists: {0}", fi.Exists); 
     Console.WriteLine("FullName: {0}", fi.FullName); 
     Console.WriteLine("Name: {0}", fi.Name); 
     Console.WriteLine("Extension: {0}", fi.Extension); 
     Console.WriteLine("Attributes: {0}", fi.Attributes); 
     Console.WriteLine("Contents: {0}", File.ReadAllText(fi.FullName)); 
    } 
    } 
} 

...出力:

########### FileSystemInfo 1 ########### 
fsi: test.txt 
Exists: True 
FullName: C:\Test\test.txt 
Name: test.txt 
Extension: .txt 
Attributes: Archive 
########### FileSystemInfo 2 ########### 
fsi: . 
Exists: False 
FullName: C:\Test\. 
Name: . 
Extension: . 
Attributes: Directory 
########### FileInfo 1 ########### 
fi: C:\Test\test.txt 
Exists: True 
FullName: C:\Test\test.txt 
Name: test.txt 
Extension: .txt 
Attributes: Archive 
Contents: test 
########### FileInfo 2 ########### 
fi: C:\Test\test2.txt 
Exists: True 
FullName: C:\Test\test2.txt 
Name: test2.txt 
Extension: .txt 
Attributes: Archive 

Unhandled Exception: System.UnauthorizedAccessException: Access to the path 'C:\Test\test2.txt' is denied. 
    at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) 
    at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy) 
    at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options) 
    at System.IO.StreamReader..ctor(String path, Encoding encoding, Boolean detectEncodingFromByteOrderMarks, Int32 bufferSize) 
    at System.IO.StreamReader..ctor(String path, Encoding encoding) 
    at System.IO.File.ReadAllText(String path, Encoding encoding) 
    at System.IO.File.ReadAllText(String path) 
    at GetFilesTest.Main() in c:\Users\Yvonne\Temp\GetFilesTest.cs:line 29 
+0

So GetFileSystemInfos(GetFileSystemInfos()は、ファイルのロックと非表示を開始するときにすべてが機能するかどうかを確認するために、 "* .txt")は存在しないディレクトリ "。"を返します。 – Carra

+0

ファイルロックがファイルに対して行ったことは、DirectoryInfo.GetFileSystemInfosメソッドを混乱させることは明らかです。通常の使用では、それは存在しないディレクトリを返すことはありません。 – brianpeiris

+0

はい、RageousはおそらくFileLockツールが.netで使用されるWindows APIにフックするのは間違いありません。 – Carra

関連する問題