2015-10-18 1 views
-1

Большинство высокоуровневых представлений файлов являются потоками. C fopen, ActiveX's Scripting.FileSystemObject и ADODB.Stream - на самом деле все, что построено на вершине C, скорее всего, будет использовать представление потока для редактирования файлов.Чтение и запись раздела файла только файла (без потоков)

Однако при изменении больших двоичных файлов с фиксированной структурой (~ 4MiB) представляется бесполезным считывать весь файл в память и записывать почти то же самое на диск - это почти наверняка будет связано с ограничением производительности. Глядя на большинство несжатых файловых систем, мне кажется, нет причин, по которым часть файла не могла быть прочитана и записана, не касаясь окружающих данных. В максимуме блок должен быть переписан, но обычно это порядка 4KiB; намного меньше, чем весь файл для больших файлов.

Пример:

00 01 02 03 
04 05 06 07 
08 09 0A 0B 
0C 0D 0E 0F 

может стать:

00 01 02 03 
04 F0 F1 F2 
F3 F4 F5 0B 
0C 0D 0E 0F 

Решение с использованием существующих объектов ActiveX было бы идеально, но любой способ сделать это без необходимости переписывать весь файл будет хорошо.

+0

Не могли бы вы обновить свой вопрос, включив в него фрагменты кода? Кроме того, hta/javascript абсолютно необходимо. Если вы используете технологию, считаете ли вы PowerShell? http://stackoverflow.com/questions/20935356/methods-to-hex-edit-binary-files-via-powershell –

+0

@StephenQuan Я имею в виду подход, основанный на потоке управления файлами. Я не знаю, как это сделать на C, и мне сказали, что это невозможно в Python ... Это может быть невозможно! Ссылка, которую вы дали, просто открывает файл, а затем сохраняет измененную копию, снова записывая все неизменные байты ... Я хочу, чтобы путь касался только измененных байтов по причинам скорости. – wizzwizz4

+0

BTW, я не из тех, кто занижает ваш вопрос, я хотел бы знать, почему люди думают, что это тоже плохой вопрос, так как я думаю, что это законный вопрос. Я думаю, что PowerShell по-прежнему остается правильным способом. Вы все еще можете использовать HTA в качестве интерфейса внешнего интерфейса и делать что-то в соответствии с: http://stackoverflow.com/questions/20935356/methods-to-hex-edit-binary-files-via-powershell –

ответ

2

Хорошо, вот, как сделать упражнение в PowerShell (например, hello.ps1):

$path = "hello.txt" 
$bw = New-Object System.IO.BinaryWriter([System.IO.File]::Open($path, [System.IO.FileMode]::Open, [System.IO.FileAccess]::ReadWrite, [System.IO.FileShare]::ReadWrite)) 
$bw.BaseStream.Seek(5, [System.IO.SeekOrigin]::Begin) 
$bw.Write([byte] 0xF0) 
$bw.Write([byte] 0xF1) 
$bw.Write([byte] 0xF2) 
$bw.Write([byte] 0xF3) 
$bw.Write([byte] 0xF4) 
$bw.Write([byte] 0xF5) 
$bw.Close() 

Вы можете проверить его из командной строки:

powershell -file hello.ps1 

Затем вы можете вызвать это из вашего ОМТ as:

var wsh = new ActiveXObject("WScript.Shell"); 
wsh.Run("powershell -file hello.ps1"); 
Смежные вопросы