Что нового

[Файловая система] Расшренная работа с файлами.

SyDr

Сидра
Сообщения
651
Репутация
158
Интересуют следующие возможности:
1) Запись в произвольное место файла с перезаписью существующих данных. В бетах уже реализовано. В релизе - с помощью WinApi.
2) Увеличение/уменьшение размера файла. Реализовано с помощью WinApi.

3) Удаление из произвольного места файла. Такого вроде не видел. WinHex умеет.
4) Дозапись в произвольное место файла. Тоже есть в WinHex.

Собственно, интерсуют пункты 3,4. Может быть я плохо искал :smile:
3. Я могу прочитать то, что идёт после удаляемого блока, уменьшить размер файла, записать данные обратно.
4. Почти также.
Но... Как-то это... Мазохизм получается :whistle:
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Почему мазохизм? Мазохизм, это когда ты будешь редактировать FAT. А так, используй структуры, и запись в файл будет почти мгновенной.
 
Автор
SyDr

SyDr

Сидра
Сообщения
651
Репутация
158
Всмысле использовать структуры?

Скажем, есть у меня файл размером 2 Гб. Мне нужно удалить 2-75 байты и начиная с 145 байта вписать указаннае данные. Получается мне нужно использовать ещё один файл :laugh: Что ж. Придёться продумывать работу намного более серъёзно...
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Другого способа я не знаю.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
А как же новая FileSetPos...

Код:
#include <Constants.au3>

Local Const $sFile = "test.txt"
Local $hFile = FileOpen($sFile, 2)

; Check if file opened for writing OK
If $hFile = -1 Then
	MsgBox(0, "Error", "Unable to open file.")
	Exit
EndIf

; Write something to the file.
FileWriteLine($hFile, "Line1")
FileWriteLine($hFile, "Line2")
FileWriteLine($hFile, "Line3")

;Flush the file to read from it
FileFlush($hFile)
FileSetPos($hFile, 5, $FILE_BEGIN)

$sRead = FileRead($hFile)

;Flush the file to write
FileFlush($hFile)
FileSetPos($hFile, 5, $FILE_BEGIN)

FileWrite($hFile, ": Test after [Line1]" & $sRead)

; Close the handle.
FileClose($hFile)

MsgBox(0, "", FileRead($sFile))

; Clean up the temporary file.
FileDelete($sFile)
 
Автор
SyDr

SyDr

Сидра
Сообщения
651
Репутация
158
Ах да, забыл сказать: нужна работа в бинарном режиме.

CreatoR [?]
А как же новая FileSetPos
Что-то я не особо понимаю это. Как мне обличить в таком случае пункт 1 от 3. Когда я открываю файл в бинарном режиме - данные перезаписываются. А если так, то добавляются?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
SyDr [?]
Когда я открываю файл в бинарном режиме - данные перезаписываются. А если так, то добавляются?
Их нужно прочитать сперва с той точки, куда нужно дописать/перезаписать. Пример выше можно изменить для работы с бинарными данными, просто добавить к 2-йке 16 (FileOpen($sFile, 2+16)).
 
Автор
SyDr

SyDr

Сидра
Сообщения
651
Репутация
158
А... ТЬфу :D Я даже код нормально не посмотрел. Это ведь и есть то, что записано у меня в решении 3 пункта. Только что удалять данные не обязательно.
Похоже, стоит отказаться от идеи изменять содержимое файла в реальном времени :smile:
 
Верх