写到每行的结尾--autoit

时间:2018-01-02 04:13:40

标签: autoit filesize filewriter

我希望脚本读取.txt文件并写入每行末尾的变量结果,而不是MsgBox,在我的例子中是$ FileSize

以下是自动脚本的代码

if(chosenMan.GetType() == typeof(man1)){
            man1 man11= new man1();
            Console.WriteLine(man11.val); //No Error
}if(chosenMan.GetType() == typeof(man2)){
            man1 man22= new man1();
            Console.WriteLine(man22.val); //No Error
}if(chosenMan.GetType() == typeof(man3)){
            man1 man33= new man1();
            Console.WriteLine(man33.val); //No Error
}

以下是.txt文件的内容

#include <MsgBoxConstants.au3>
#include <File.au3>

Test()

Func Test()

    For $i = 1 to _FileCountLines(@TempDir & "\myfiles.txt")
        $mread = FileReadLine(@TempDir & "\myfiles.txt", $i)

    Local $FileSize = FileGetSize($mread)

    MsgBox($MB_SYSTEMMODAL, "", ByteSuffix($FileSize)) ;this is just a test
    Next
EndFunc   ;==>Example

Func ByteSuffix($Bytes)
    Local $Index = 0, $aArray = [' bytes', ' KB', ' MB', ' GB', ' TB', ' PB', ' EB', ' ZB', ' YB']
    While $Bytes > 1023
        $Index += 1
        $Bytes /= 1024
    WEnd
    Return Round($Bytes) & $aArray[$Index]
EndFunc   

我想要以下结果

C:\Users\G-PC\Documents\setup.exe
C:\Users\G-PC\Documents\config.ini
C:\Users\G-PC\Documents\image001.jpg
C:\Users\G-PC\Documents\image002.jpg
C:\Users\G-PC\Documents\image003.jpg

3 个答案:

答案 0 :(得分:2)

size limit for both string variables and arrays,因此在处理大文件时,您必须一次处理一行。这使用临时文件进行输出,而不是将所有信息保存在内存中。您可以将临时文件重命名(覆盖原始文件)到最后的原始文件名。

Func Test()
    Local $InFile = FileOpen(@TempDir & "\myfiles.txt", $FO_READ)
    Local $OutFile = FileOpen(@TempDir & "\myfiles.tmp", $FO_OVERWRITE)
    While True
        $File = FileReadLine($InFile)
        If @error = -1 Then Return ; no more lines to process
        FileWrite($OutFile, $File & " [" & ByteSuffix(FileGetSize($File)) & "]" & @CRLF)
    WEnd
EndFunc   ;==>Test

答案 1 :(得分:1)

$sResult = Test()
ConsoleWrite('SIZE LIST' & @CRLF & $sResult)

Func Test()
    Local $FileSize, $sReturn = ''

    For $i = 1 to _FileCountLines(@TempDir & "\myfiles.txt")
        $mread = FileReadLine(@TempDir & "\myfiles.txt", $i)

        $FileSize = FileGetSize($mread)

        ; MsgBox($MB_SYSTEMMODAL, "", ByteSuffix($FileSize)) ;this is just a test
        $sReturn &= $mread & " [" & ByteSuffix($FileSize) & "]" & @CRLF
    Next
    Return $sReturn
EndFunc   ;==>Test

但是更好的方法是使用_FileReadToArray而不是逐行读取文本文件。你可以用文本行迭代数组。

答案 2 :(得分:1)

在循环中使用FileReadLine的行号参数重置 指向开始的文件指针,并扫描到减慢的行号 随着行数的增加而下行。省略那个参数。

使用文件句柄,这样就不会继续打开和关闭 在循环中读取每行的文件。

#include <MsgBoxConstants.au3>
#include <File.au3>

$sResult = Test()
MsgBox(0, @ScriptName, $sResult)


Func Test()
    Local $iFileSize, $hFile, $sFilePath, $sResult

    ; Open a file handle to read.
    $hFile = FileOpen(@TempDir & "\myfiles.txt")
    If $hFile = -1 Then
        MsgBox(0x30, @ScriptName, 'Unable to open file to read.')
        Exit 1
    EndIf

    While 1
        ; Read and let AutoIt handle line count.
        $sFilePath = FileReadLine($hFile)
        If @error Then ExitLoop

        $iFileSize = FileGetSize($sFilePath)
        If @error Then ContinueLoop

        $sResult &= StringFormat('%s %s\r\n', $sFilePath, ByteSuffix($iFileSize))
    WEnd

    FileClose($hFile)

    Return $sResult
EndFunc

Func ByteSuffix($Bytes)
    Local $Index = 0
    Local $aArray = [' bytes', ' KB', ' MB', ' GB', ' TB', ' PB', ' EB', ' ZB', ' YB']

    While $Bytes > 1023
        $Index += 1
        $Bytes /= 1024
    WEnd

    Return Round($Bytes) & $aArray[$Index]
EndFunc