问题类似于我的另一个问题(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可以创建此类文件。
要重现,请执行以下步骤:
答案 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
您需要先创建一个有效名称的文件,然后在代码中引用该文件。