如何打开名称由空格组成的文件?

时间:2011-04-05 14:41:17

标签: .net file-io whitespace

问题类似于我的另一个问题(GetDirectories fails to enumerate subfolders of a folder with #255 name)。

在我的C#3.5 .NET应用程序中,我正在尝试使用

打开文件
using (FileStream fileStream = 
new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))

但是,如果文件名类似于“”,则代码将失败并显示异常

  

类型的第一次机会异常   'System.IO.DirectoryNotFoundException'   发生在mscorlib.dll附加   信息:找不到的一部分   路径“C:\ Temp \”。

是否可以用.NET手段打开这样的文件?

P.S。这不是人为的情况(就像怀疑我之前的问题的人一样),这样的文件可以通过流行的软件完美地创建,例如,如果您创建一个名称仅由空格组成的邮件文件夹,Thunderbird可以创建此类文件。

要重现,请执行以下步骤:

  • 下载并安装Far Commander或Mozilla Thunderbird
  • 在Far中创建一个名为“”的文件。在Thunderbird中,在您的邮件帐户中创建一个名为“”
  • 的子文件夹
  • 尝试使用上面的代码打开名为“”的文件

2 个答案:

答案 0 :(得分:3)

看来,访问文件的典型.Net方式不会考虑特殊字符。我的初步答案是假设文件名是一个空格,但我现在看到你打算将它作为Alt + 255字符。这是一个使用Win32 API打开文件的示例Console应用程序:

class Program
{
    public const UInt32 GENERIC_ALL = 0x10000000;
    public const UInt32 GENERIC_READ = 0x80000000;
    public const UInt32 GENERIC_WRITE = 0x40000000;
    public const UInt32 GENERIC_EXECUTE = 0x20000000;
    public const UInt32 FILE_SHARE_READ = 0x00000001;
    public const UInt32 FILE_SHARE_WRITE = 0x00000002;
    public const UInt32 CREATE_ALWAYS = 2;
    public const UInt32 CREATE_NEW = 1;
    public const UInt32 OPEN_ALWAYS = 4;
    public const UInt32 OPEN_EXISTING = 3;
    public const UInt32 TRUNCATE_EXISTING = 5;

    [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
    private static extern Microsoft.Win32.SafeHandles.SafeFileHandle CreateFile(string lpFileName, System.UInt32 dwDesiredAccess, System.UInt32 dwShareMode, IntPtr pSecurityAttributes, System.UInt32 dwCreationDisposition, System.UInt32 dwFlagsAndAttributes, IntPtr hTemplateFile);

    static void Main(string[] args)
    {
        Microsoft.Win32.SafeHandles.SafeFileHandle oSafeHandle = CreateFile(@"Path to your folder\ ", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero);
        using (FileStream oFS = new FileStream(oSafeHandle, FileAccess.Read))
        {
            Console.WriteLine("file was opened");
        }

        Console.ReadLine();
    }
}

答案 1 :(得分:1)

Windows要求您指定文件名,不能创建名称只有一个空格的文件。 Windows Naming Conventions

您需要先创建一个有效名称的文件,然后在代码中引用该文件。