0

我想从一个大文件中删除最后一个字符。限制是:

  • 该文件必须在原位修改,而不使用类似的第二个文件所需的磁盘空间
  • 这是一台Windows机器
  • 我无法将任何已编译的代码复制到机器上,因此我无法创建 c++ 程序的小型 c# 程序来操作文件
  • 这也意味着任何非本机脚本都不可用,例如 python。

据我所知,这限制了我使用 bat、VB(或 JScript),但看起来这些中没有可行的选择。VB 需要从系统文件对象创建一个 TextStream,但是我相信这个流必须保存在其他地方,使用磁盘空间。

有没有办法简单地做到这一点?

4

1 回答 1

1

按照 Noodles 的想法(当然你需要安装一些 .net 框架版本),你可以试试这个

(另存为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代码。最好直接写程序,编译使用。但只是作为一个例子......

于 2014-10-06T14:16:20.367 回答