В php разве нет способа удаления части данных их файла?

12 3
R
На сайте с 17.11.2011
Offline
22
1618

Если файл больше чем выделенная память и нужно удалить часть данных файла, то получается, никак?

Перерыл мануаль, ничего не нашел.

Неужели единственный вариант, это создавать временный файл?

домашняя страница - google.com.ua
DV
На сайте с 01.05.2010
Offline
644
#1

Можно fgets исходный файл, и лить в другой с помощью fputs.

VDS хостинг ( http://clck.ru/0u97l ) Нет нерешаемых задач ( https://searchengines.guru/ru/forum/806725 ) | Перенос сайтов на Drupal 7 с любых CMS. ( https://searchengines.guru/ru/forum/531842/page6#comment_10504844 )
R
На сайте с 28.04.2007
Offline
155
Rel
#2
DenisVS:
Можно fgets исходный файл, и лить в другой с помощью fputs.

Это и есть вариант с временным файлом.

Дешевое продление и регистрация .RU/.РФ в RU-CENTER - 190 руб. (/ru/forum/758778) в розницу. http://nic.regdomains.ru (http://nic.regdomains.ru) - регистрация и продление доменов в автоматическом режиме.
R
На сайте с 17.11.2011
Offline
22
#3

а ведь таки нет такого, как delete($fp,$pos,$length)

Вот это называется приплыли 😂

Не ожидал от php такого

N
На сайте с 06.05.2007
Offline
419
#4

Раз позиция чтения и позиция записи в файле между собой не связаны.

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

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

netwind добавил 23.11.2011 в 23:20

rommer:
Не ожидал от php такого

а в какой ОС или языке это есть?

Кнопка вызова админа ()
R
На сайте с 17.11.2011
Offline
22
#5
DenisVS:
Можно fgets исходный файл, и лить в другой с помощью fputs.

а если влить в тот самый?:)

rommer добавил 23.11.2011 в 23:22

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

Лучше уж временный


а в какой ОС или языке это есть?

да в любом. Во всяком случае в дельфах и сях точно есть. правда, там со стримами работа, а не с указателями.

N
На сайте с 06.05.2007
Offline
419
#6
rommer:
Лучше уж временный

но временный потребует в 2 раза больше места на диске и затратам на поиск этого места.


да в любом. Во всяком случае в дельфах и сях точно есть. правда, там со стримами работа, а не с указателями.

утютю.

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

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

А php с той же самой целью копирует функции стандартной библиотеки С.

R
На сайте с 17.11.2011
Offline
22
#7
netwind:
но временный потребует в 2 раза больше места на диске и затратам на поиск этого места.

утютю.
Суть проблемы в том, что классические библиотеки ввода-вывода "ортогональны". то есть состоят из набора функций, которые друг друга не дублируют или дублируют в крайних случаях.
Если возможно реализовать удаление блока внутри файла с помощью других элементарных функций, значит их не будут делать. это было нужно для переносимости ОС и стандартной библиотеки. Чем меньше функций нужно реализовать тем, легче их перенести. Для delphi и windows вообще, подобный вопрос не стоял.
А php с той же самой целью копирует функции стандартной библиотеки С.

а ну рахз утютю, то тогда вопросов больше нема.

Токо имейте в виду, что ц и делфи именно удаляют куски, а не перезаписывают весь файл.

rommer добавил 24.11.2011 в 01:03

Народ, кто знает, если открыть два указателя на один файл, то пройдет чтение/запись на разных операционках?

N
На сайте с 06.05.2007
Offline
419
#8
rommer:
да в любом. Во всяком случае в дельфах и сях точно есть. правда, там со стримами работа, а не с указателями.

Ну-ка расскажи нам про Си. Учти, что Ритчи смотрит на тебя и будет рагневан, если ты назовешь языком Си какие-то вариации на тему.

Какие такие стандартные функций ANSI C позволяют удалить кусок файла?

wwwwww
На сайте с 29.04.2011
Offline
195
#9
rommer:
Неужели единственный вариант, это создавать временный файл?

Ну почему же?

Изучите возможности работы с бинарными файлами. В общем случае решение поставленной задачи сведется к:

- открытие на запись\чтение

- нахождения начала ненужного куска

- нахождения конца ненужного куска

- побайтовое копирование информации с учетом сдвига и обнуление "хвоста"

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

Функций "вырезания" из файла на диске не существует в силу ряда ограничений. Поэтому любые операции с файлами сводятся к работе через временные файлы.

Видишь? Свободная подпись.
R
На сайте с 17.11.2011
Offline
22
#10
wwwwww:
Ну почему же?

Изучите возможности работы с бинарными файлами. В общем случае решение поставленной задачи сведется к:
- открытие на запись\чтение
- нахождения начала ненужного куска
- нахождения конца ненужного куска
- побайтовое копирование информации с учетом сдвига и обнуление "хвоста"

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

Функций "вырезания" из файла на диске не существует в силу ряда ограничений. Поэтому любые операции с файлами сводятся к работе через временные файлы.

Очевидно это единственная возможность решения без создавания временных файлов.

Есть вопрос: если открыть два указателя на один файл (чтобы сразу считывать через один указатель и сразу писать на второй), то пройдет такое на разных операционках?

12 3

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий