2011-04-05 34 views
1

這個問題類似於我的另一個問題(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)) 

但是一個文件,如果文件名是像「」,該代碼失敗,出現異常

類型 的第一次機會異常mscorlib.dll中出現'System.IO.DirectoryNotFoundException' 其他 信息:無法找到 路徑「C:\ Temp \」的一部分。

是否可以使用.NET方式打開這樣的文件?

P.S.這不是人爲的情況(就像我之前提出的疑問一樣),這樣的文件可以由流行的軟件完美地創建,例如,如果您創建名稱僅包含空格的郵件文件夾,Thunderbird可以創建此文件。

要重現,請執行下列操作步驟:

  • 下載並安裝遠東司令或Mozilla Thunderbird
  • 在遠東建立一個檔案,一個名爲「」。在雷鳥,在郵件帳戶名稱「」
  • 嘗試打開一個名爲「」使用上面的代碼
+0

我無法在win xp中創建此類文件夾?你是怎麼做到的? – manji 2011-04-05 14:46:39

+0

這不是我,這是雷鳥。 – Alex 2011-04-05 19:49:17

+0

或者你可以使用像Far或Total Commander這樣的文件指揮官。 – Alex 2011-04-05 19:49:40

回答

3

看來,典型的.Net訪問文件的方式不會考慮特殊字符。我最初的答案是假設文件名是一個空格,但我現在看到你打算將它作爲Alt + 255字符。以下是使用Win32 API打開文件的示例控制檯應用程序:

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

謝謝雅各!看起來像一個解決方案 - 我會測試並讓你知道。 – Alex 2011-04-06 09:03:11

+0

您的解決方案有效 - 謝謝。我唯一想提到的是該文件不是255個符號,它實際上只包含空格。但是,它仍然適用於您的解決方案。 – Alex 2011-04-06 09:18:45

1

的Windows創建子文件夾需要你指定的文件名,你不能創建文件名稱只有一個空格。 Windows Naming Conventions

您需要先使用有效名稱創建一個文件,然後在您的代碼中引用該文件。

+0

謝謝,但這個評論是可以發送到Mozilla的。我與創建這些文件無關。我只需要打開已經存在的文件。 – Alex 2011-04-05 14:52:30

+0

添加到重新生成如何創建這樣的文件到問題描述的步驟。 – Alex 2011-04-05 19:55:45

相關問題