C# Directory.GetFiles()提供奇怪的返回值

C# Directory.GetFiles()提供奇怪的返回值,c#,.net,file,io,locking,C#,.net,File,Io,Locking,当我试图用一个名为的工具在我的目录中隐藏一个文件时,就会出现这个问题。这不是一个常规的隐藏,因为我无法在windows资源管理器中看到它。 代码: 第二个函数如何返回“c:\mydir\”文件?我可以删除所有不存在的文件来解决我的问题,但我想知道为什么我首先会得到一个“.”文件 “.”指当前目录。尝试: Directory.Exists(textFiles[0]); 看看它在起作用 为什么第二个重载返回条目而第一个重载不返回条目,我不知道。“”指的是当前目录。尝试: Directory.Exi

当我试图用一个名为的工具在我的目录中隐藏一个文件时,就会出现这个问题。这不是一个常规的隐藏,因为我无法在windows资源管理器中看到它。 代码:

第二个函数如何返回“c:\mydir\”文件?我可以删除所有不存在的文件来解决我的问题,但我想知道为什么我首先会得到一个“.”文件

“.”指当前目录。尝试:

Directory.Exists(textFiles[0]);
看看它在起作用

为什么第二个重载返回条目而第一个重载不返回条目,我不知道。

“”指的是当前目录。尝试:

Directory.Exists(textFiles[0]);
看看它在起作用


我不知道为什么第二个重载返回条目而第一个重载没有返回条目。

我没有使用文件锁定工具的经验,但我可以假设它钩住FindFirstFile WinAPI函数以保护某些文件不被列出(该函数由.NET Directory.GetFiles()函数使用)。这个钩子可以写一点。。。童车:)

请尝试禁用该工具并重新进行测试,好吗?
你很可能会解决这个问题。

但是如果您得到相同的结果,请归咎于Directory.GetFiles()。

我没有使用文件锁定工具的经验,但我可以假设它钩住FindFirstFile WinAPI函数以保护某些文件不被列出(该函数由.NET Directory.GetFiles()函数使用)。这个钩子可以写一点。。。童车:)

请尝试禁用该工具并重新进行测试,好吗?
你很可能会解决这个问题。

但是,如果得到相同的结果,请将更多的调查归咎于Directory.GetFiles()。

  • 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

再调查一下:

  • 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

没有工具,它可以正常工作。我们的一位测试人员刚想到,当他开始锁定和隐藏文件时,检查一切是否正常;)可能将此主题的链接发送到文件锁定工具支持会让您的测试人员更高兴:)没有该工具,它可以正常工作。我们的一位测试人员刚想到,当他开始锁定和隐藏文件时,检查一切是否正常;)向文件锁定工具支持发送指向此主题的链接可能会让测试人员更高兴:)因此GetFileSystemInfos(“*.txt”)返回一个不存在的目录“.”。显然,文件锁定对文件所做的任何操作都会混淆DirectoryInfo.GetFileSystemInfos方法。在正常使用中,它永远不会返回不存在的目录。是的,文件锁工具挂接到.net使用的windows api可能是正确的。因此GetFileSystemInfo(“*.txt”)返回一个不存在的目录。“。显然,无论文件锁对文件做什么,都会混淆DirectoryInfo.GetFileSystemInfo方法。在正常使用中,它不会返回不存在的目录。是的,FileLock工具挂钩到.net使用的windows api可能是正确的。