Python не откроет файл с именем PRN.anything [duplicate]

У меня была следующая конфигурация, приводящая к той же ошибке при запросе ответов с сервера.

Серверная сторона: SparkJava - > предоставляет клиентскую часть REST-API: ExtJs6 -> обеспечивает рендеринг браузера

На стороне сервера мне пришлось добавить это к ответу:

Spark.get("/someRestCallToSpark", (req, res) -> {
    res.header("Access-Control-Allow-Origin", "*"); //important, otherwise its not working 
    return "some text";
 });

На стороне клиента мне пришлось добавить к запросу:

Ext.Ajax.request({
    url: "http://localhost:4567/someRestCallToSpark",
    useDefaultXhrHeader: false, //important, otherwise its not working
    success: function(response, opts) {console.log("success")},
    failure: function(response, opts) {console.log("failure")}
});

226
задан Steven Penny 8 January 2014 в 02:55
поделиться

12 ответов

«Полное руководство» запрещенных имен файлов не будет работать в Windows, поскольку оно хранит имена файлов, а также символы. Да, символы типа * " ? и другие запрещены, но существует бесконечное количество имен, состоящих только из допустимых символов, которые запрещены. Например, пробелы и точки являются действительными именами имен файлов, но имена, состоящие только из этих символов, запрещены.

Windows не различает символы верхнего и нижнего регистра, поэтому вы не можете создать папку с именем A, если один из них a уже существует. Хуже, по-видимому, такие имена, как PRN и CON, и многие другие, зарезервированы и не разрешены. Windows также имеет несколько ограничений длины; имя файла, действительное в одной папке, может стать недействительным, если оно перемещено в другую папку. Правила для именования файлов и папок находятся в MSDN.

Вы не можете, в общем, использовать созданный пользователем текст для создания имен каталога Windows. Если вы хотите разрешить пользователям называть все, что они хотят, вы должны создавать безопасные имена, такие как A, AB, A2 и др., Хранить имена пользователей и их эквиваленты пути в файле данных приложения и выполните сопоставление маршрутов в вашем приложении.

Если вы абсолютно должны разрешать имена файлов, созданных пользователем, единственный способ определить, являются ли они недопустимыми, - это исключить исключения и предположить, что имя недействительно. Даже это чревато опасностью, поскольку исключения, запрещенные для доступа, автономные диски и из пространства на диске, перекрываются с теми, которые могут быть выбраны для недопустимых имен. Вы открываете одну огромную баню с болью.

162
ответ дан Dour High Arch 25 August 2018 в 22:12
поделиться

Вместо создания черного списка символов вы можете использовать белый список. Учитывая все обстоятельства, диапазон символов, которые имеют смысл в контексте имени файла или каталога, довольно короткий, и если у вас нет особых требований к именованию, ваши пользователи не будут удерживать его против вашего приложения, если они не могут использовать всю таблицу ASCII.

Он не решает проблему зарезервированных имен в целевой файловой системе, но с белым списком легче смягчить риски в источнике.

В этом духе это диапазон символов, которые можно считать безопасными:

  • Буквы (az AZ) - символы Юникода, если необходимо
  • Цифры (0- 9)
  • Подчеркивание (_)
  • Hyphen (-)
  • Пробел
  • Dot (.)

И любые дополнительные безопасные символы, которые вы хотите разрешить. Помимо этого, вам просто нужно обеспечить соблюдение некоторых дополнительных правил в отношении пробелов и точек. Обычно это достаточно:

  • Имя должно содержать хотя бы одну букву или номер (чтобы избежать только точек / пробелов)
  • Имя должно начинаться с буквы или цифры (чтобы избежать ведущие точки / пробелы)

Это уже позволяет довольно сложные и бессмысленные имена. Например, эти имена будут возможны с этими правилами и будут действительными именами файлов в Windows / Linux:

  • A...........ext
  • B -.- .ext

По сути, даже с таким количеством белых символов вы все равно должны решить, что на самом деле имеет смысл, и соответствующим образом утвердить / отредактировать имя. В одном из моих приложений я использовал те же правила, что и выше, но разделил любые повторяющиеся точки и пробелы.

26
ответ дан AeonOfTime 25 August 2018 в 22:12
поделиться

Давайте сохраним это просто и ответим на вопрос.

  1. Запрещенные печатные символы ASCII: Linux / Unix:
    / (forward slash)
    
    Windows:
    < (less than)
    > (greater than)
    : (colon - sometimes works, but is actually NTFS Alternate Data Streams)
    " (double quote)
    / (forward slash)
    \ (backslash)
    | (vertical bar or pipe)
    ? (question mark)
    * (asterisk)
    
  2. Непечатаемые символы. Если ваши данные поступают из источника, который позволяет печатать непечатаемые символы, тогда есть еще что проверить. Linux / Unix:
    0 (NULL byte)
    
    Windows:
    0-31 (ASCII control characters)
    
    Примечание: Хотя в файловых системах Linux / Unix запрещено создавать файлы с контрольными символами в имени файла, это может быть кошмар для [gg]
  3. Зарезервированные имена файлов Сохранены следующие имена файлов: Windows:
    CON, PRN, AUX, NUL 
    COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9
    LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, LPT9
    
  4. Другие правила Windows: имена файлов не могут заканчиваться пробелом или точка.
267
ответ дан Athari 25 August 2018 в 22:12
поделиться

Хотя единственными незаконными символами Unix могут быть / и NULL, хотя должно быть включено некоторое рассмотрение интерпретации командной строки.

Например, хотя может быть законным назвать файл 1>&2 или 2>&1 в Unix, имена файлов, такие как это, могут быть неверно истолкованы при использовании в командной строке.

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

0
ответ дан CodeMouse92 25 August 2018 в 22:12
поделиться

Начиная с 18/04/2017, нет простого черного или белого списка символов и имен файлов среди ответов на эту тему, и есть много ответов.

Лучшее предложение, которое я мог бы придумать с должен был позволить пользователю назвать файл, как ему нравится. Используя обработчик ошибок, когда приложение пытается сохранить файл, поймайте все исключения, предположите, что имя файла виновато (очевидно, после того, как был уверен, что путь сохранения был в порядке) и предложите пользователю новое имя файла. Для достижения наилучших результатов поместите эту процедуру проверки в цикл, который продолжается до тех пор, пока пользователь не поправится или не сдастся.

Пример кода VBA: (будет добавлен позже сегодня)

1
ответ дан FCastro 25 August 2018 в 22:12
поделиться

В Unix-оболочках вы можете процитировать почти каждый символ в одинарных кавычках '. Кроме самой одиночной кавычки, и вы не можете выразить управляющие символы, потому что \ не расширяется. Доступ к самой одинарной кассе изнутри указанной строки возможен, потому что вы можете объединить строки с одинарными и двойными кавычками, например 'I'"'"'m', которые могут быть использованы для доступа к файлу с именем "I'm" (здесь также возможна двойная цитата).

Поэтому вам следует избегать всех контрольных символов, потому что их слишком сложно ввести в оболочку. Остальное по-прежнему забавно, особенно файлы, начинающиеся с тире, потому что большинство команд читают их как параметры, если у вас нет двух дефис -- раньше, или вы указываете их с помощью ./, который также скрывает исходный -.

Если вы хотите быть приятным, не используйте ни один из символов, которые оболочка и типичные команды используют в качестве синтаксических элементов, иногда зависимых от положения, поэтому, например, вы все равно можете использовать -, но не как первый символ; то же самое с ., вы можете использовать его как первый символ только тогда, когда вы имеете в виду его («скрытый файл»). Когда вы имеете в виду, ваши имена файлов - это escape-последовательности VT100 ;-), так что ls искажает вывод.

-1
ответ дан forthy42 25 August 2018 в 22:12
поделиться

В Linux и других связанных с Unix системах есть только два символа, которые не могут отображаться в имени файла или каталога, а это NUL '\0' и косой чертой '/'. Конечно, косая черта может появляться в имени пути, разделяя компоненты каталога.

У Rumour1 есть то, что Стивен Борн (из «славы оболочки») имел каталог, содержащий 254 файла, по одному для каждой отдельной буквы ( символьный код), который может отображаться в имени файла (исключая /, '\0', конечно, имя . было текущим каталогом).

Другие люди рассмотрели правила Windows.

Обратите внимание, что MacOS X имеет случайную копию, нечувствительной файловой системы.

1 Это был Kernighan & amp; Pike in Практика программирования , которая так много говорила в главе 6 «Тестирование», § 6.5. Тесты стресса:

Когда Стив Борн писал свою оболочку Unix (которая приходила быть известным как оболочка Bourne), он создал каталог из 254 файлов с односимвольными именами, по одному для каждого байтового значения, кроме '\0' и косой черты, двух символов, которые не могут отображаться в именах файлов Unix. Он использовал этот каталог для всех тестов соответствия шаблонов и токенизации. (Конечно, тестовый каталог, конечно же, был создан программой.) В течение многих лет этот каталог был проклятием программ для дрессировки файлов; он тестировал их на уничтожение.

48
ответ дан Jonathan Leffler 25 August 2018 в 22:12
поделиться

Хорошо, если только для исследовательских целей, то лучше всего посмотреть эту запись в Википедии на имена файлов .

Если вы хотите написать переносную функцию для проверки ввода пользователя и создания имен файлов на основе этого, короткий ответ - нет. Взгляните на переносимый модуль, такой как File :: Spec Perl], чтобы взглянуть на все прыжки, необходимые для выполнения такой «простой» задачи.

23
ответ дан Leonardo Herrera 25 August 2018 в 22:12
поделиться

У меня была такая же потребность и я искал рекомендации или стандартные ссылки и наткнулся на эту тему. Мой текущий черный список символов, которых следует избегать в именах файлов и каталогов:

$CharactersInvalidForFileName = {
    "pound" -> "#",
    "left angle bracket" -> "<",
    "dollar sign" -> "$",
    "plus sign" -> "+",
    "percent" -> "%",
    "right angle bracket" -> ">",
    "exclamation point" -> "!",
    "backtick" -> "`",
    "ampersand" -> "&",
    "asterisk" -> "*",
    "single quotes" -> "“",
    "pipe" -> "|",
    "left bracket" -> "{",
    "question mark" -> "?",
    "double quotes" -> "”",
    "equal sign" -> "=",
    "right bracket" -> "}",
    "forward slash" -> "/",
    "colon" -> ":",
    "back slash" -> "\\",
    "lank spaces" -> "b",
    "at sign" -> "@"
};
-2
ответ дан Meng Lu 25 August 2018 в 22:12
поделиться

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

0
ответ дан Paramaeleon 25 August 2018 в 22:12
поделиться

Легкий способ заставить Windows сказать вам ответ - попытаться переименовать файл через Explorer и ввести / для нового имени. Windows откроет окно сообщения, в котором сообщается список недопустимых символов.

A filename cannot contain any of the following characters:
    \ / : * ? " < > | 

https://support.microsoft.com/en-us/kb/177506

21
ответ дан raimue 25 August 2018 в 22:12
поделиться

Для Windows вы можете проверить его с помощью PowerShell

$PathInvalidChars = [System.IO.Path]::GetInvalidPathChars() #36 chars

. Для отображения кодов UTF-8 вы можете конвертировать

$enc = [system.Text.Encoding]::UTF8
$PathInvalidChars | foreach { $enc.GetBytes($_) }

$FileNameInvalidChars = [System.IO.Path]::GetInvalidFileNameChars() #41 chars

$FileOnlyInvalidChars = @(':', '*', '?', '\', '/') #5 chars - as a difference
4
ответ дан Wojciech Sciesinski 25 August 2018 в 22:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: