2013-01-07 6 views
3

Я запускаю Windows 7 в VirtualBox на хосте OS X 10.8. Хост имеет общую папку с файлом с именем >>>FILE<<< внутри. По-видимому, OS X сама по себе не имеет проблем с такими именами файлов. К сожалению, я не могу открыть эти файлы в Windows 7 из-за < s и > s в названии. В C, этот вызов не выполняется:Доступ к файлам с недопустимыми именами в Windows

CreateFileW(
    L"\\\\VBOXSVR\\ft1\\>>>FILE<<<", 
    GENERIC_READ, 
    FILE_SHARE_READ, 
    NULL, 
    OPEN_EXISTING, 
    FILE_ATTRIBUTE_NORMAL, 
    NULL 
    ); 

GetLastError возвращает ERROR_INVALID_NAME (123). Если я изменю имя файла на FILE, я получаю действительный дескриптор, и все в порядке.

Известно ли в Windows доступ к файлам с недопустимыми символами в их именах? Предположим, что продуктивная среда не имеет прямого доступа для записи в файловую систему хоста.

+1

Предоставляет ли удаленная файловая система короткие имена файлов? Если это так, вы можете получить доступ к файлу, используя его краткое имя. –

+0

@JonathanPotter ваша идея хорошая, но нет, файловая система не поддерживает короткие имена файлов, а VirtualBox не делится ими. Это может работать с папкой тома NTFS, совместно используемой в реальной сети с соответствующим драйвером. Краткое имя файла будет выглядеть как '___ FIL ~ 1'. –

ответ

2

@ Ответ jcophenha был на правильном пути. Однако, если вы читаете the page that @jcopenha linked to, в нем указано, что префикс \\?\ предназначен только для локальных путей. Вы должны использовать префикс \\?\UNC\ вместо для путей UNC, например:

L"\\\\?\\UNC\\VBOXSVR\\ft1\\>>>FILE<<<" 
+0

Извините, это тоже не работает. Это расстраивает. –

+1

Если '\\? \ UNC \ server \ share' не работает, вам не повезло.Удаленный файл необходимо переименовать в нечто более совместимое с кросс-платформой (или, по крайней мере, создать символическую ссылку, которая будет отображаться внутри реального файла и доступна для кросс-платформенного доступа). –

+0

@Remy Проблема заключается в том, что оба '<' and '>' зарезервированы. –

1

В < и > символы не могут быть использованы в имени файла Windows. И поэтому файл не может быть открыт под Win32.

документация naming conventions перечисляет следующие зарезервированные символы:

  • < (меньше)
  • > (больше)
  • : (двоеточие)
  • "(двойные кавычки)
  • /(передняя косая черта)
  • \ (обратная косая черта)
  • | (вертикальный стержень или труба)
  • ? (Знак вопроса)
  • * (звездочка)

Windows, значительно отличается в этой области от * NIX систем. В * nix обычно нет таких ограничений для ОС, которые могут использоваться в файле. Как мой друг однажды обнаружил, когда он попытался удалить файл с именем * и получил самые неудачные последствия.

Теперь возможно, что эти ограничения не применяются при использовании встроенного API. Вы можете попробовать открыть файл с NtCreateFile. Это может сработать!

+0

Боюсь, что вы правы. 'NtCreateFile' не помогло, я мог открыть файл только после удаления' <' and '> 'от имени. Как ни странно, другие запрещенные символы, такие как труба '' ', не имеют проблем. –