Удалить символ из файла на месте с помощью собственных инструментов 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 компилируется каждый раз. Лучше напрямую написать программу, скомпилировать и использовать. Но просто в качестве примера...

Другие вопросы по тегам