Максимальная длина имени файла php

Что не так с ограничением максимальной длины имени файла?

В общем, нашёл, что под Windows ограничение на 255 символов, а под Linux на 255 байт, и написал такой код для копирования файлов с переименованием (там в имени сохраняются координаты прямоугольиков, и их может быть много, не лучшее решение, но это не я придумал).

Всё это падает сразу после вывода второго QMessageBox::warning, т.е. при сохранении с переименованием. Но сам алгоритм исключает ситуацию, что будет сохранено более 255 символов (включая расширение с точкой). Что не так?

Максимальная длина имени файла php. Смотреть фото Максимальная длина имени файла php. Смотреть картинку Максимальная длина имени файла php. Картинка про Максимальная длина имени файла php. Фото Максимальная длина имени файла php

Максимальная длина имени файла php. Смотреть фото Максимальная длина имени файла php. Смотреть картинку Максимальная длина имени файла php. Картинка про Максимальная длина имени файла php. Фото Максимальная длина имени файла php

Максимальная длина имени файла php. Смотреть фото Максимальная длина имени файла php. Смотреть картинку Максимальная длина имени файла php. Картинка про Максимальная длина имени файла php. Фото Максимальная длина имени файла php

Максимальная длина имени файла php. Смотреть фото Максимальная длина имени файла php. Смотреть картинку Максимальная длина имени файла php. Картинка про Максимальная длина имени файла php. Фото Максимальная длина имени файла php

Максимальная длина имени файла php. Смотреть фото Максимальная длина имени файла php. Смотреть картинку Максимальная длина имени файла php. Картинка про Максимальная длина имени файла php. Фото Максимальная длина имени файла php

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

С UTF-8 WinAPI работать не умеет.

В WinAPI существует UNC-нотация путей, в которой лимит на длину пути соответствует лимиту файловой системы. Например, это будет 32КБ для NTFSv3.

Источник

Работа с файлами в PHP

Чтение файла: file_get_contents()

С помощью функции file_get_contents() можно получить содержимое файла:

Также мы можем получить html-код какой-либо страницы в интернете:

Но работает это далеко не для всех сайтов, у многих есть защита от такого примитивного парсинга.

Чтение файла: file()

Функция file() позволяет получить содержимое файла в виде массива. Разделителем элементов является символ переноса строки.

Создадим в корне сайта файл data.txt со следующим содержимым:

Теперь запустим скрипт index.php со следующим кодом:

При запуске этого скрипта мы получим в браузере:

Заметили, что у первых двух строк длина 7 символов вместо пяти? Это из-за того, что каждая строка содержит в конце символы переноса строки.

Чаще всего они нам не нужны, поэтому их можно убрать, передав вторым параметром константу FILE_IGNORE_NEW_LINES :

Теперь у всех строк будет по 5 символов.

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

Разумеется, мы можем передать сразу две константы:

Создание файла и запись в файл: file_put_contents()

Функция file_put_contents() позволяет создать файл и заполнить его данными.

Чтобы не перезаписывать данные, а добавить их в конец файла, нужно передать третьим параметром константу FILE_APPEND :

Также вторым параметром можно передать массив:

Но этот вариант не очень удобен, поскольку все элементы массива запишутся подряд, без каких-либо разделителей. Чтобы их добавить, можно использовать функцию implode:

Создание папки или структуры папок

Создать папку можно с помощью функции mkdir() (make directory):

Кроме этого, второй параметр может игнорироваться при заданной umask (пользовательская маска (user mask), которая нужна для определения конечных прав доступа). В этом случае принудительно сменить права можно функцией chmod() :

Также мы можем создать структуру папок рекурсивно, для этого нужно третьим параметром передать true :

Но в этом случае права доступа будут заданы только для конечной папки. Для изменения прав у каждой из папок придётся указывать права вручную:

Проверка существования файла или папки

Проверить существование папки или файла можно с помощью функции file_exists() :

Если вы хотите проверить существование только папки или только файла, для этого есть специальные функции is_dir() и is_file() :

Проверка прав доступа

Функции is_readable() и is_writable() проверяют, есть ли у пользователя, от имени которого запущен PHP, права на чтение и запись файла или папки:

Копирование, перенос и удаление файла

Для удаления файлов используется функция unlink() :

Чтобы скопировать файл, используем функцию copy() :

Для переименования и переноса файла в другую папку используется функция rename() :

Работа с файлами с помощью fopen()

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

Итак, открыть (или создать и открыть) файл можно с помощью функции fopen() :

Для построчного чтения файла используется функция fgets() :

Также в PHP существует множество других полезных функций, работающих с дескриптором файла. Почитать о них можно в документации.

Источник

Переменные — PHP: Основы

Что такое переменная

Представьте себе задачу: нам нужно напечатать на экран фразу Father! два раза или даже пять раз. Эту задачу можно решить в лоб:

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

Когда переменная создана, можно начать её использовать. Она подставляется в те места, где раньше стояла наша фраза. Во время выполнения интерпретатор (программа, которая выполняет код на PHP), доходит до строчки print_r($greeting); и подставляет вместо переменной её содержимое, а затем выполняет код.

Количество создаваемых переменных никак не ограничено, большие программы содержат десятки и сотни тысяч имён переменных. Для удобства анализа программы переменные принято создавать как можно ближе к тому месту, где они используются.

Изменение переменной

Само слово «переменная», говорит о том, что её можно менять. И действительно, с течением времени внутри программы значения переменных могут изменяться:

Имя осталось тем же, но внутри другие данные. Следует заметить, что переменные в PHP не требуют специального объявления. Вместо этого переменная объявляется при первом её использовании в программе.

Ошибки при работе с переменными

Главное правило: переменная должна быть объявлена до её использования. Если сделать это позже, то программа просто не заработает.

Запуск программы выше завершается с ошибкой PHP Notice — это ошибка обращения. Она означает, что в коде используется имя (говорят идентификатор), который не определен. Причём в самой ошибке явно указан индентификатор переменой: greeting. Кроме неправильного порядка определения, в PHP встречаются банальные опечатки — как при использовании переменной, так и во время её объявления. Количество подобных ошибок уменьшается за счёт использования правильно настроенного редактора. Такой редактор подсвечивает имена, которые используются без объявления, и предупреждает о возможных проблемах.

Константы

Некоторые данные, такие как математические постоянные, никогда не меняются. Возьмем число π. Приближённо оно всегда равно 3.14 и не может измениться. Для обращения к подобным данным в PHP принято использовать константы.

Создание константы отличается от создания переменной. Оно начинается с ключевого слова const и последующего имени константы. При этом знак доллара не нужен. Далее ей присваивается нужное значение. Константы принято именовать буквами в верхнем регистре с _ в качестве разделителя. Константа, как и переменная, может использоваться в любом выражении. Единственное ограничение — константу нельзя изменить, что звучит довольно логично.

В PHP очень много встроенных констант, которые можно использовать в любом месте программы. Вот некоторые из них:

Кроме обычных констант, в PHP существует отдельная группа — магические константы. Их отличия заключаются в следующем:

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

Выражения в определениях

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

Для начала переведем 50 евро в доллары. Допустим, что один евро равен 1.25 доллара:

Любая строка — это выражение. Конкатенация строк — тоже выражение. Когда интерпретатор видит выражение, он обрабатывает его и генерирует результат — значение выражения. Вот несколько примеров выражений, а в комментариях справа от каждого выражения — итоговое значение:

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

Программы состоят из множества комбинаций выражений, и понимание этой концепции — один из ключевых шагов на вашем пути.

Как вы уже поняли, использовать переменные можно и с конкатенацией. Синтаксически ничего не меняется: мы умеем конкатенировать (склеивать) две строки:

Интерполяция

Немного усложним выражение со склейкой строк:

Хотя это довольно простой случай, но, наверное, вы согласитесь — выглядит это немного безобразно. Нужно следить за несколькими кавычками и пробелами, и без вглядывания не понять, где что начинается и кончается. Есть другой, более удобный и изящный способ решения той же задачи — интерполяция. Вот как это выглядит:

Мы просто создали одну строку и «вставили» в неё в нужные места переменные с помощью фигурных скобок ( <> ). Получился как будто бланк, куда внесены нужные значения. И нам не нужно больше заботиться об отдельных строках для знаков препинания и пробелов — все эти символы просто записаны в этой строке-шаблоне. В одной строке можно делать сколько угодно блоков с фигурными скобками.

Интерполяция работает только со строками в двойных кавычках.

Почти во всех языках интерполяция предпочтительнее конкатенации для объединения строк. Строка при этом получается склеенная, и внутри неё хорошо просматриваются пробелы и другие символы.

Heredoc

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

Обратите внимание, что перед закрывающим идентификатором (в нашем случае EOT ) не должны стоять пробелы, иначе PHP начнёт ругаться на ошибку синтаксиса.

Дополнительные материалы

Максимальная длина имени файла php. Смотреть фото Максимальная длина имени файла php. Смотреть картинку Максимальная длина имени файла php. Картинка про Максимальная длина имени файла php. Фото Максимальная длина имени файла php

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты.

Источник

Максимальная длина имени файла

Как на линуксе делают nas для виндоус клиентов если с utf8 длинна русского имени файла не может быть больше 130 символов а японского 80. Может лайфхак какой есть для обхода ограничений?

Если кодировка в системе русская однобайтная то можно делать русские имена 255 символов длиной но при этом все символы которых нет в этой кодировке вызывают ошибку слишком длинное имя.

Может есть такая utf кодировка в которой русские буквы 1 байт занимают

Максимальная длина имени файла php. Смотреть фото Максимальная длина имени файла php. Смотреть картинку Максимальная длина имени файла php. Картинка про Максимальная длина имени файла php. Фото Максимальная длина имени файла php

Максимальная длина имени файла php. Смотреть фото Максимальная длина имени файла php. Смотреть картинку Максимальная длина имени файла php. Картинка про Максимальная длина имени файла php. Фото Максимальная длина имени файла php

Я не в курсе технических ограничений samba, но из твоего текста я так понимаю там есть какое-то ограничение в 256 байт на имя файла.

В utf8 символы могут занимать от 1 до 4 байт. А в utf16 всегда 2 байта. Я бы использовал utf16 и получил константные 128 символов на имя для любых языков.

Максимальная длина имени файла php. Смотреть фото Максимальная длина имени файла php. Смотреть картинку Максимальная длина имени файла php. Картинка про Максимальная длина имени файла php. Фото Максимальная длина имени файла php

Может лайфхак какой есть для обхода ограничений?

Нет. /thread (потому что других вопросов я не увидел, а на этот ответ однозначный).

Максимальная длина имени файла php. Смотреть фото Максимальная длина имени файла php. Смотреть картинку Максимальная длина имени файла php. Картинка про Максимальная длина имени файла php. Фото Максимальная длина имени файла php

Всегда два байта в UCS-2. В UTF-16 может быть два или четыре байта на символ (а может уже и больше, тут не уверен).

Я бы использовал utf16 и получил константные 128 символов на имя для любых языков.

Источник

basename

(PHP 4, PHP 5, PHP 7, PHP 8)

basename — Возвращает последний компонент имени из указанного пути

Описание

При передаче строки с путём к файлу или каталогу, данная функция вернёт последний компонент имени из данного пути.

Список параметров

На платформах Windows в качестве разделителей имён директорий используются оба слеша (прямой / и обратный \ ). В других операционных системах разделителем служит прямой слеш ( / ).

Возвращаемые значения

Примеры

Пример #1 Пример использования функции basename()

Результат выполнения данного примера:

Смотрите также

User Contributed Notes 30 notes

It’s a shame, that for a 20 years of development we don’t have mb_basename() yet!

There is only one variant that works in my case for my Russian UTF-8 letters:

If your path has a query string appended, and if the query string contains a «/» character, then the suggestions for extracting the filename offered below don’t work.

In such a case, use:

It might be useful to have a version of the function basename working with arrays too.

Here is a quick way of fetching only the filename (without extension) regardless of what suffix the file has.

// your file
$file = ‘image.jpg’ ;

There is a real problem when using this function on *nix servers, since it does not handle Windows paths (using the \ as a separator). Why would this be an issue on *nix servers? What if you need to handle file uploads from MS IE? In fact, the manual section «Handling file uploads» uses basename() in an example, but this will NOT extract the file name from a Windows path such as C:\My Documents\My Name\filename.ext. After much frustrated coding, here is how I handled it (might not be the best, but it works):

If you want the current path where youre file is and not the full path then use this 🙂

www dir: domain.com/temp/2005/january/t1.php

Exmaple for exploding 😉 the filename to an array

A simple way to return the current directory:
$cur_dir = basename(dirname($_SERVER[PHP_SELF]))

since basename always treats a path as a path to a file, e.g.

/var/www/site/foo/ indicates /var/www/site as the path to file
foo

Even though yours is shorter, you can also do:

$ext = end(explode(«.», basename($file

Additional note to Anonymous’s mb_basename() solution: get rid of trailing slashes/backslashes!

echo mb_basename ( «/etc//» ); # «etc»
?>

I got a blank output from this code

suggested earlier by a friend here.

So anybody who wants to get the current directory path can use another technique that I use as

//suppose you’re using this in pageitself.php page

once you have extracted the basename from the full path and want to separate the extension from the file name, the following function will do it efficiently:

On windows systems, filenames are case-insensitive. If you have to make sure the right case is used when you port your application to an unix system, you may use a combination of the following:

//assume the real filename is mytest.JPG:

Because of filename() gets «file.php?var=foo», i use explode in addition to basename like here:

to get the base url of my website

Basename without query string:

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *