Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Чем отличается работа fopen + fread на Linux и Windows?
Форумы портала PHP.SU » » Работа с файловой системой и файлами » Чем отличается работа fopen + fread на Linux и Windows?

Страниц (1): [1]
 

1. Aljnk - 24 Июля, 2012 - 11:13:35 - перейти к сообщению
Добрый день.
Столкнулся с такой проблемой - есть функция, которая работает с бинарными данными загружаемого файла.
CODE (htmlphp):
скопировать код в буфер обмена
  1. myFunction(fread(fopen($fileway, "rb"), filesize($fileway)));

Создавал и тестировал функцию на Windows. Но когда закинул ее на Linux хостинг, оказалось, что при чтении файла через fopen ->fread бинарные данные на Linux получаются другие. В частности, вместо \х0 выдает \0, а вместо ' выдает ''. После того как поменял одно на другое все заработало. Но я тестировал лишь один файл, а их может быть много разных и возможно обнаружатся еще несоответствия. Информацию о таких различиях я нигде не нашел. Подскажите, кто знает, где можно найти такую информацию? Или возможно есть php функции или способы избежать подобной проблемы?
Спасибо.
2. Мелкий - 24 Июля, 2012 - 11:36:23 - перейти к сообщению
Используйте file_get_contents. Во всяком случае открытый дескриптор файла висеть не будет.
3. Aljnk - 24 Июля, 2012 - 11:49:02 - перейти к сообщению
file_get_contents не подходит - ничего не меняется.
CODE (htmlphp):
скопировать код в буфер обмена
  1.    echo $txt; //Windows выдает - dx\x0Bl'...
  2.    echo $txt; //Linux выдает - dx\0Bl''...

а для меня важно чтоб эти данные были одинаковы.
4. Мелкий - 24 Июля, 2012 - 12:14:09 - перейти к сообщению
Эм. А с чего вы взяли, что визуальное представление двух бинарников будет идентичным? Сверяйте хотя бы 16-ый вид.
5. Aljnk - 24 Июля, 2012 - 12:36:18 - перейти к сообщению
Мелкий пишет:
А с чего вы взяли, что визуальное представление двух бинарников будет идентичным?

Ну как бы файл то один и тот же и символы те же самые. Просто в случае windows, file_get_contents записывает этот конкретный символ как \х0, а Linux выдает как \0. Самое интересное в том, что если перезаписать файл –
CODE (htmlphp):
скопировать код в буфер обмена
  1. $file = fread(fopen($fileway, "rb"), filesize($fileway));
  2. fwrite(fopen(" file.txt", "wb"), $file);

то в Windows получится точно такой же файл, а в Linux - не получается.
6. Aljnk - 30 Июля, 2012 - 14:15:52 - перейти к сообщению
Че, реально никто не знает почему на Linux
CODE (htmlphp):
скопировать код в буфер обмена
  1. $file = fread(fopen($fileway, "rb"), filesize($fileway));
  2. fwrite(fopen(" file.txt", "wb"), $file);

не получается тот же самый файл?
Может хоть идеи какие есть? За что зацепиться?
7. Stierus - 03 Августа, 2012 - 10:19:40 - перейти к сообщению
первое - шестнадцатиричное представление, второе - восьмеричное, скорее всего
8. Aljnk - 03 Августа, 2012 - 10:27:57 - перейти к сообщению
А как сделать чтоб и там и там было одинаково?
9. Stierus - 03 Августа, 2012 - 10:48:03 - перейти к сообщению
Что бы посмотреть двоичный файл (сравниваем побитово):

PHP:
скопировать код в буфер обмена
  1. $filePath = 'path_to_file';
  2. $handle = fopen($filePath, 'rb');
  3. $fsize = filesize($filePath);
  4. $contents = fread($handle, $fsize);
  5. fclose($handle);
  6.  
  7. $odata = '';
  8. for($i = 0; $i < $fsize; $i++)
  9. {
  10.    $asciiCharacter = $contents[$i];
  11.    $base10value = ord($asciiCharacter);
  12.    $base2representation = base_convert($base10value, 10, 2);
  13.    $odata .= $base2representation;
  14. }
  15.  
  16. printf($odata);



ps
Тебе нужно понять, в каких местах идут расхождения - выложить файл и сказать, какие символы обрабатываются по-разному (не в двоичном виде, base64encode, например)
10. Aljnk - 03 Августа, 2012 - 13:21:33 - перейти к сообщению
Такой код не поможет. Дело в том, что после fopen ->fread в переменную уже записан неправельный вариант. Повторю код:
CODE (htmlphp):
скопировать код в буфер обмена
  1.    echo $txt; //Windows выдает - dx\x0Bl'...
  2.    echo $txt; //Linux выдает - dx\0Bl''...

Так вот в Windows $contents[2] == "\x0" и $contents[3] == "B"
А на Linux получается $contents[2] == "\" и $contents[3] == "0"
То есть мало того, что он неправельно отдает символы, так он из 1 символа делает 2.

Я пробовал делать replace, но неправельный "\0" и совершенно правельные 2 символа идущие подряд "\" и "0" он не различает и спокойно меняет. Если в файле нет естественных "\" и "0" идущих подряд, то после замены получается корректный файл. А если есть, то замена не помогает.

Файл - любой рисунок. После $img=fopen ->fread => fopen ->fwrite( ,$img) на Linux рисунок не востанавливается.

Другие кодировки не пробовал. Пока не думал над этим, но так с ходу не совсем понятно как я потом смогу к байтам перейти? А это важно - ведь моя функция ищет конкретные комбинации байтов и преобразовывает их.
11. Stierus - 06 Августа, 2012 - 13:22:33 - перейти к сообщению
Выложи сюда архив, в архиве: файл из винды, тот же файл из линукса, скрипт, которым открываешь.

зы
попробуй обновить пых, возможно, это бага в нем
12. Aljnk - 06 Августа, 2012 - 15:06:27 - перейти к сообщению
Скидываю архив со всем, что просили...
Как я заметил проблема возникает только с теми файлами у которых изначально есть перечисленные мной последовательности. То есть, если в открытом на Windows файле есть \0 или '', то для Windows это не проблема. А при открытии на Linux появляются такие же последовательности вместо \x0 и '. И он их не различает...

Если я вас правельно понял, то пых это php? Обновить его нет возможности, так как проблемы с тем php, который у моего хостера. Если у вас на Linux все будет работать нормально, то прийдется общатся с хостером Улыбка
13. Stierus - 06 Августа, 2012 - 15:10:59 - перейти к сообщению
вечером посмотрю
14. Aljnk - 22 Августа, 2012 - 18:35:46 - перейти к сообщению
Ну, как результат? Это у меня глючит или у вас то же самое?

 

Powered by ExBB FM 1.0 RC1