Как открыть файл с именем, состоящим из пробелов? - PullRequest
1 голос
/ 05 апреля 2011

Вопрос похож на другой мой вопрос ( GetDirectories не может перечислить подпапки папки с именем # 255 ).

В моем приложении C # 3.5 .NET, которое я пытаюсь открытьфайл, используя

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

Однако, если имя файла похоже на "", код завершается ошибкой с исключением

Первое случайное исключение типа 'System.IO.DirectoryNotFoundException 'произошло в mscorlib.dll Дополнительная информация: Не удалось найти часть пути "C: \ Temp \".

Можно ли открыть такой файл с помощью .NETзначит или нет?

PS Это не искусственная ситуация (как кто-то подозревал в моем предыдущем вопросе), такой файл может быть идеально создан с помощью популярного программного обеспечения, например, Thunderbird может создать такой файл, если вы создаете почтовую папку симя, состоящее только из пробелов.

Чтобы воспроизвести, выполните следующие действия:

  • Загрузите и установите Far Commander или Mozilla Thunderbird
  • В Far создайте файлс именем "".В Thunderbird создайте подпапку в своей почтовой учетной записи с именем ""
  • Попробуйте открыть файл с именем "", используя код выше

Ответы [ 2 ]

3 голосов
/ 06 апреля 2011

Похоже, что типичный способ доступа к файлам .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();
    }
}
1 голос
/ 05 апреля 2011

Windows требует от вас указать имя файла, вы не можете создать файл с именем только один пробел. Соглашения об именах Windows

Сначала вам нужно будет создать файл с правильным именем, а затем ссылаться на него в своем коде.

...