Modify

Opened 17 years ago

Closed 16 years ago

Last modified 16 years ago

#1134 closed Bug (Fixed)

Code cleanup of _FileWriteToLine()

Reported by: partypooper@… Owned by: J-Paul Mesnage
Milestone: 3.3.1.2 Component: Standard UDFs
Version: Other Severity: None
Keywords: _FileWriteToLine() Cc:

Description

Just a slight code clean-up by reducing the number of lines required for the function to operate.

; #FUNCTION# ====================================================================================================================
; Name...........: _FileWriteToLine
; Description ...: Writes text to a specific line in a file.
; Syntax.........: _FileWriteToLine($sFile, $iLine, $sText[, $fOverWrite = 0])
; Parameters ....: $sFile      - The file to write to
;                  $iLine      - The line number to write to
;                  $sText      - The text to write
;                  $fOverWrite - If set to 1 will overwrite the old line
;                  |If set to 0 will not overwrite
; Return values .: Success - 1
;                  Failure - 0
;                  @Error  - 0 = No error
;                  |1 = File has less lines than $iLine
;                  |2 = File does not exist
;                  |3 = Error when opening file
;                  |4 = $iLine is invalid
;                  |5 = $fOverWrite is invalid
;                  |6 = $sText is invalid
; Author ........: cdkid
; Modified.......: partypooper - code cleanup
; Remarks .......: If _FileWriteToLine is called with $fOverWrite as 1 and $sText as "", it will delete the line.
; Related .......:
; Link ..........:
; Example .......: Yes
; ===============================================================================================================================
Func _FileWriteToLine($sFile, $iLine, $sText, $fOverWrite = 0)
	If $iLine <= 0 Then Return SetError(4, 0, 0)
	If Not IsString($sText) Then Return SetError(6, 0, 0)
	If $fOverWrite <> 0 And $fOverWrite <> 1 Then Return SetError(5, 0, 0)
	If Not FileExists($sFile) Then Return SetError(2, 0, 0)
	Local $filtxt = FileRead($sFile, FileGetSize($sFile))
	$filtxt = StringSplit($filtxt, @CRLF, 1)
	If UBound($filtxt, 1) < $iLine Then Return SetError(1, 0, 0)
	Local $fil = FileOpen($sFile, 2)
	If $fil = -1 Then Return SetError(3, 0, 0)
	For $i = 1 To UBound($filtxt) - 1
		If $i = $iLine Then
			If Not $fOverWrite Then ; overwrite option 'off'
				FileWrite($fil, $sText & @CRLF) ; insert new line
				FileWrite($fil, $filtxt[$i] & @CRLF) ; write old line after new
			Else ; overwrite option 'on'
				If $sText <> "" Then FileWrite($fil, $sText & @CRLF) ; write new line in place of old
			EndIf
		ElseIf $i < UBound($filtxt, 1) - 1 Then
			FileWrite($fil, $filtxt[$i] & @CRLF)
		ElseIf $i = UBound($filtxt, 1) - 1 Then
			FileWrite($fil, $filtxt[$i])
		EndIf
	Next
	FileClose($fil)
	Return 1
EndFunc   ;==>_FileWriteToLine

Attachments (0)

Change History (5)

comment:1 by TicketCleanup, 17 years ago

Version: 3.3.1.0

Automatic ticket cleanup.

comment:2 by MrCreatoR <mscreator@…>, 17 years ago

This function is litle bit bugy...

Reproduce example:

#include <File.au3>

$sFile = @ScriptDir & "\File.txt"

$hFile = FileOpen($sFile, 2)

For $i = 1 To 20
	FileWrite($hFile, "Line #" & $i & @LF)
Next

FileClose($hFile)

$iLine = 12

_FileWriteToLine($sFile, $iLine, "Hello World", 0)
ConsoleWrite(@error & @CRLF)

Here we get @error = 1, but there is 20 lines in file, yes, the lines are delimited by @LF not @CRLF, but some text editors do the same when we manualy writing lines to file, so we need to take this in count.

So here is a fixed version, plus speed improvements:

Func _FileWriteToLine($sFile, $iLine, $sText, $fOverWrite = 0)
	If $iLine <= 0 Then Return SetError(4, 0, 0)
	If Not IsString($sText) Then Return SetError(6, 0, 0)
	If $fOverWrite <> 0 And $fOverWrite <> 1 Then Return SetError(5, 0, 0)
	If Not FileExists($sFile) Then Return SetError(2, 0, 0)

	Local $sRead_File = FileRead($sFile)
	Local $aSplit_File = StringSplit(StringStripCR($sRead_File), @LF)
	If UBound($aSplit_File) < $iLine Then Return SetError(1, 0, 0)
	
	$sRead_File = ""
	
	For $i = 1 To $aSplit_File[0]
		If $i = $iLine Then
			If $fOverWrite = 1 Then
				If $sText <> '' Then $sRead_File &= $sText & @CRLF
			Else
				$sRead_File &= $sText & @CRLF & $aSplit_File[$i] & @CRLF
			EndIf
		ElseIf $i < $aSplit_File[0] Then
			$sRead_File &= $aSplit_File[$i] & @CRLF
		ElseIf $i = $aSplit_File[0] Then
			$sRead_File &= $aSplit_File[$i]
		EndIf
	Next
	
	Local $hFile = FileOpen($sFile, 2)
	If $hFile = -1 Then Return SetError(3, 0, 0)
	
	FileWrite($hFile, $sRead_File)
	FileClose($hFile)
	
	Return 1
EndFunc

comment:3 by J-Paul Mesnage, 16 years ago

Type: Feature RequestBug

for as demonstrated by MrCreatoR it is more than a bug

comment:4 by J-Paul Mesnage, 16 years ago

Milestone: 3.3.1.2
Owner: changed from Gary to J-Paul Mesnage
Resolution: Fixed
Status: newclosed

Fixed in version: 3.3.1.2

comment:5 by TicketCleanup, 16 years ago

Version: Other

Automatic ticket cleanup.

Modify Ticket

Action
as closed The owner will remain J-Paul Mesnage.

Add Comment


E-mail address and name can be saved in the Preferences .
 
Note: See TracTickets for help on using tickets.