- Offizieller Beitrag
Hier ein kleines Testskript, das alles erklärt:
AutoIt
#include <File.au3>
Local $File = 'test_write.txt'
Local $sContent = _
'Easy to learn BASIC-like syntax' & @CRLF & _
'Simulate keystrokes and mouse movements' & @CRLF & _
'Manipulate windows and processes' & @CRLF & _
'Interact with all standard windows controls' & @CRLF & _
'Scripts can be compiled into standalone executables' & @CRLF & _
'Create Graphical User Interfaces (GUIs)' & @CRLF & _
'COM support' & @CRLF & _
'Regular expressions' & @CRLF & _
'Directly call external DLL and Windows API functions' & @CRLF & _
'Scriptable RunAs functions' & @CRLF & _
'Detailed helpfile and large community-based support forums' & @CRLF & _
'Compatible with Windows XP / Server 2003 / Vista / Server 2008 / Windows 7 / Windows 8 / Windows 10' & @CRLF & _
'Unicode and x64 support' & @CRLF & _
'Digitally signed for peace of mind' & @CRLF & _
'Works with the User Account Control (UAC) found in Windows beginning with Vista' & @CRLF
FileWrite($File, $sContent)
; wenn man die Datei im Editor betrachtet, endet sie - wie gewollt - mit einem Zeilenumbruch
; Ändere ich jetzt aber den Inhalt einer Zeile wie folgt:
_FileWriteToLine($File, 2, 'Bla-Bla', True)
; dann wird der letzte Zeilenumbruch in der Datei "verschluckt"
Alles anzeigen
Könnt ihr dieses Verhalten nachvollziehen?
Wenn ja ist das wohl ein Bug. Denn wenn ich nun im AppendMode auf die Datei zugreife, landet neuer Inhalt statt in einer neuen Zeile, am letzten Wort der letzten Zeile.
EDIT:
Ja, ist (m.M.) ein Bug. Habe die Funktion mal entsprechend erweitert. Standardmäßig wird nun auch das abschliessende CRLF geschrieben, kann optional abgewählt werden:
AutoIt
; #FUNCTION# ====================================================================================================================
; Author ........: cdkid
; Modified.......: partypooper, MrCreatoR
; BugFix: The last line needs normally also a CRLF. So here is a new parameter to define this.
; ===============================================================================================================================
Func __FileWriteToLine($sFilePath, $iLine, $sText, $bOverWrite = False, $bLastLineCRLF = True)
If $iLine <= 0 Then Return SetError(4, 0, 0)
If Not IsString($sText) Then
$sText = String($sText)
If $sText = "" Then Return SetError(6, 0, 0)
EndIf
If $bOverWrite = Default Then $bOverWrite = False
If Not (IsBool($bOverWrite) Or $bOverWrite = 0 Or $bOverWrite = 1) Then Return SetError(5, 0, 0) ; For old versions.
If Not FileExists($sFilePath) Then Return SetError(2, 0, 0)
Local $aArray = FileReadToArray($sFilePath)
Local $iUBound = UBound($aArray) - 1
If ($iUBound + 1) < $iLine Then Return SetError(1, 0, 0)
Local $hFileOpen = FileOpen($sFilePath, FileGetEncoding($sFilePath) + $FO_OVERWRITE)
If $hFileOpen = -1 Then Return SetError(3, 0, 0)
Local $sData = ""
$iLine -= 1 ; Now the array is 0-based, so reduce the line number by 1.
For $i = 0 To $iUBound
If $i = $iLine Then
If $bOverWrite Then
If $sText Then $sData &= $sText & @CRLF
Else
$sData &= $sText & @CRLF & $aArray[$i] & @CRLF
EndIf
ElseIf $i < $iUBound Then
$sData &= $aArray[$i] & @CRLF
ElseIf $i = $iUBound Then
$sData &= $aArray[$i] & ($bLastLineCRLF ? @CRLF : '')
EndIf
Next
FileWrite($hFileOpen, $sData)
FileClose($hFileOpen)
Return 1
EndFunc ;==>__FileWriteToLine
Alles anzeigen