Удалить символ из файла на месте с помощью собственных инструментов Windows
Я хотел бы удалить последний символ из большого файла. Ограничения таковы:
- файл должен быть изменен на месте, без использования места на диске, необходимого для аналогичного второго файла
- это машина для Windows
- Я не могу скопировать какой-либо скомпилированный код на машину, поэтому я не могу создать небольшую программу на C# из программы на C++ для манипулирования файлом
- это также означает, что любые неродные сценарии недоступны, например, python.
Насколько я знаю, это ограничивает меня bat, VB (или JScript), но не похоже, что в них есть жизнеспособный вариант. VB требует, чтобы TextStream был создан из объекта системного файла, но тогда этот поток, я считаю, должен быть сохранен в другом месте, используя дисковое пространство.
Есть ли способ сделать это просто?
1 ответ
Решение
Следуя идее Noodles (конечно, вам нужно установить какую-то версию.net framework), вы можете попробовать это
(сохранить как trim.cmd
и позвонить как trim.cmd "fileToTrim.dat"
)
@if (@this==@isBatch) @then
@echo off
setlocal enableextensions disabledelayedexpansion
rem check arguments
set "fileToTrim=%~1"
if not exist "%fileToTrim%" goto :eof
rem search for a valid framework version
set "frameworks=%SystemRoot%\Microsoft.NET\Framework"
set "jsc="
for /f "tokens=* delims=" %%a in (
'dir /b /a:d /o:-n "%frameworks%\v*"'
) do if not defined jsc if exist "%frameworks%\%%a\jsc.exe" set "jsc=%frameworks%\%%a\jsc.exe"
if not defined jsc goto :eof
set "executable=%~dpn0.%random%.exe"
%jsc% /nologo /out:"%executable%" "%~f0"
if exist "%executable%" (
"%executable%" "%fileToTrim%"
del "%executable%" >nul 2>nul
)
endlocal
exit /b 0
@end
import System;
import System.IO;
var arguments:String[] = Environment.GetCommandLineArgs();
if (arguments.length > 1) {
var fi:FileInfo = new FileInfo(arguments[1]);
var fs:FileStream = fi.Open(FileMode.Open);
fs.SetLength (
Math.max(0, fi.Length - 1)
);
fs.Close();
};
Это далеко не эффективно, код jscript компилируется каждый раз. Лучше напрямую написать программу, скомпилировать и использовать. Но просто в качестве примера...