Opened 21 months ago

Closed 3 months ago

#3678 closed Bug (Fixed)


Reported by: anonymous Owned by: Melba23
Milestone: Component: Standard UDFs
Version: Severity: None
Keywords: Cc:


_FileWriteToLine($file, $line, "", 1)
this was removing a line now it just delete it leaving empty line

Attachments (0)

Change History (11)

comment:1 Changed 21 months ago by Jos

Could you try to explain what you mean exactly, as that sentence is not clear to me?


comment:2 Changed 21 months ago by anonymous

ok, with a file with those lines :

doing this _FileWriteToLine($file, 3, "", 1) was result in

but now the result is


comment:3 Changed 21 months ago by Melba23

I see the problem - and I remember why it happens.

There was considerable discussion when the function was rewritten some years ago as to whether this "delete a line" functionality should be retained as it removes the possibility of replacing an existing line with a blank one. If it were retained, the only option to "overwrite" with a blank line was to remove the line completely and then rewrite a new blank one, which required 2 calls to the function. The consensus as I recall was that overwriting a line with a blank was more likely than deleting a line - and so the code was amended, but not the Help file.

So the question resurfaces - which of the 2 functionalities is more useful? Or should both be available? I will take a look and see what might be done to do this without overcomplicating either the syntax or the code.


Last edited 21 months ago by Melba23 (previous) (diff)

comment:4 Changed 21 months ago by Melba23

Not too difficult - but it means using 3 modes instead of the existing 2:

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

; These constants added to FileConstants.au3
Const $FWTL_INSERT = 0
Const $FWTL_DELETE = 2

$sFile = @ScriptDir & "\test.txt"
$sContent = "1" & @CRLF & "2" & @CRLF & "3" & @CRLF & "4"

FileWrite($sFile, $sContent)
; Insert a line
$iRet = _FileWriteToLine_Mod($sFile, 3, "fred", $FWTL_INSERT)
ConsoleWrite($iRet & " - " & @error & @CRLF)

FileWrite($sFile, $sContent)
; Overwrite a line
$iRet = _FileWriteToLine_Mod($sFile, 3, "fred", $FWTL_OVERWRITE)
ConsoleWrite($iRet & " - " & @error & @CRLF)

FileWrite($sFile, $sContent)
; Delete a line - obviously the $sText parameter is ignored
$iRet = _FileWriteToLine_Mod($sFile, 3, "fred", $FWTL_DELETE)
ConsoleWrite($iRet & " - " & @error & @CRLF)


; Use 3 mode options - insert, overwrite, delete
Func _FileWriteToLine_Mod($sFilePath, $iLine, $sText, $iMode = $FWTL_INSERT, $bFill = False)
	If $iMode = Default Then $iMode = $FWTL_INSERT
	If $bFill = Default Then $bFill = False
	If Not FileExists($sFilePath) Then Return SetError(2, 0, 0)
	If $iLine <= 0 Then Return SetError(4, 0, 0)
	If $iMode < 0 Or $iMode > 2 Then Return SetError(5, 0, 0)
	If Not IsString($sText) Then
		$sText = String($sText)
		If $sText = "" Then Return SetError(6, 0, 0)
	If Not IsBool($bFill) Then Return SetError(7, 0, 0)
	; Read current file into array
	Local $aArray = FileReadToArray($sFilePath)

	; Create empty array if empty file
	If @error Then Local $aArray[0]
	Local $iUBound = UBound($aArray) - 1
	; If Fill option set
	If $bFill Then
		; If required resize array to allow line to be written
		If $iUBound < $iLine Then
			ReDim $aArray[$iLine]
			$iUBound = $iLine - 1
		If ($iUBound + 1) < $iLine Then Return SetError(1, 0, 0)

	Switch $iMode
		Case 0 ; Insert
			$aArray[$iLine - 1] = $sText & @CRLF & $aArray[$iLine - 1]
		Case 1 ; Overwrite
			$aArray[$iLine - 1] = $sText
		Case 2 ; Delete
			_ArrayDelete($aArray, $iLine - 1)
			$iUBound -= 1

	; Concatenate array elements
	Local $sData = ""
	For $i = 0 To $iUBound
		$sData &= $aArray[$i] & @CRLF
	$sData = StringTrimRight($sData, StringLen(@CRLF)) ; Required to strip trailing EOL

	; Just for illustration purposes
	MsgBox($MB_SYSTEMMODAL, $iMode, $sData)

	; Write data to file
	Local $hFileOpen = FileOpen($sFilePath, FileGetEncoding($sFilePath) + $FO_OVERWRITE)
	If $hFileOpen = -1 Then Return SetError(3, 0, 0)
	FileWrite($hFileOpen, $sData)
	Return 1
EndFunc   ;==>_FileWriteToLine



comment:5 Changed 21 months ago by anonymous

this 3 modes idea seems great imo
it should please everybody

comment:6 Changed 21 months ago by BrewManNH

this 3 modes idea seems great imo
it should please everybody

I disagree, a function with the word Write in it shouldn't be deleting lines. If you think writing means deleting then I can't help with that.

comment:7 Changed 20 months ago by anonymous

Then do a LineDelete function i don't mind. There aren't any easy way to delete a line atm so...

comment:8 Changed 20 months ago by BrewManNH

It's very easy to delete a line, just read everything into an array, delete the element of the array containing the line you don't want, write the array back to the file.

comment:9 Changed 3 months ago by Jon

  • Component changed from AutoIt to Standard UDFs

comment:10 Changed 3 months ago by Jpm

  • Owner set to Melba23
  • Status changed from new to assigned

comment:11 Changed 3 months ago by Melba23

  • Milestone set to
  • Resolution set to Fixed
  • Status changed from assigned to closed

Fixed by revision [12304] in version:

Guidelines for posting comments:

  • You cannot re-open a ticket but you may still leave a comment if you have additional information to add.
  • In-depth discussions should take place on the forum.

For more information see the full version of the ticket guidelines here.

Add Comment

Modify Ticket

as closed The owner will remain Melba23.

E-mail address and user name can be saved in the Preferences.

Note: See TracTickets for help on using tickets.