Что нового

Почему текстовый файл дополняется если FileOpen поместить в переменную?

agikon

Знающий
Сообщения
789
Репутация
17
Подскажите пожалуйста почему если файл создан функцией FileOpen которую поместить в переменную, то такой файл при добавлении туда информации не переписывается заново, а просто добавляется в край. Ведь ключ "mode" стоит в "2" - открыть для записи и удалить имеющееся содержание.

Собственно вот скрипт.
При первом нажатии на клавишу должно быть в файл записатся нолик "0".
Но при следующих нажатиях в файл должно быть записано рандомное число от 1 до 100 с удалением предыдущего числа.
Но почему то предыдущее число не удаляется а добавляется.
Код:
#include <GUIConstantsEx.au3>
$GUI = GUICreate("", 200, 100)
GUISetState(@SW_SHOW, $GUI)

$button1 = GUICtrlCreateButton('0 (1-100)', 50, 40, 90, 20)
$i = 0

While 1
    Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
        Case $button1
			if $i = 0 then
				$1 = FileOpen(@ScriptDir & '\'&@UserName&'.txt', 2)
				FileWrite($1,'0')
				$i = 1
			else
				$rand = round(random(2,100))
				FileWrite($1,$rand)
			endif
	EndSwitch
WEnd
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
agikon [?]
предыдущее число не удаляется а добавляется
Всё верно, файл один раз открыт для перезаписи, а дальше запись накапливается.
Нужно файл закрывать каждый раз (FileClose), и открывать по новой чтобы переписать его.
 
Автор
A

agikon

Знающий
Сообщения
789
Репутация
17
CreatoR
та я уже и закрывал, что только не делал, весь день шаманю и никак.
ну от закрыл, так теперь вообще не добавляет ничего. дальше нолика не идёт.
Код:
#include <GUIConstantsEx.au3>

$GUI = GUICreate("", 200, 100)
GUISetState(@SW_SHOW, $GUI)

$button1 = GUICtrlCreateButton('0 (1-100)', 50, 40, 90, 20)
$i = 0

While 1
    Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
        Case $button1
			if $i = 0 then
				$1 = FileOpen(@ScriptDir & '\'&@UserName&'.txt', 2)
				FileWrite($1,'0')
				FileClose($1)
				$i = 1
			else
				$rand = round(random(2,100))
				FileWrite($1,$rand)
				FileClose($1)
			endif
	EndSwitch
WEnd
 

---Zak---

Скриптер
Сообщения
455
Репутация
120
AutoIT далеко - но если включить логику получится как-то так (по сценарию)
Код:
Case $button1
            if $i = 0 then
                $1 = FileOpen(@ScriptDir & '\'&@UserName&'.txt', 2) ;Открыть файл
                FileWrite($1,'0') ;Записать в него чего-то
                FileClose($1) ;Закрыть файл
                $i = 1
            else
                $rand = round(random(2,100))
                FileWrite($1,$rand) ; Записать непонятно во что, т.к. до этого мы файл закрыли
                FileClose($1) ; Закрыть непонятно что, т.к. до этого мы файл закрыли
            endif

и открывать по новой чтобы переписать его.
Код:
Case $button1
            if $i = 0 then
                $1 = FileOpen(@ScriptDir & '\'&@UserName&'.txt', 2) ;Открыть файл
                FileWrite($1,'0') ;Записать в него чего-то
                FileClose($1) ;Закрыть файл
                $i = 1
            else
                $1 = FileOpen(@ScriptDir & '\'&@UserName&'.txt', 2) ;Открыть файл по новой
                $rand = round(random(2,100))
                FileWrite($1,$rand) ; Записать рандом 
                FileClose($1) ; Закрыть файл
           endif
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Код:
#include <GUIConstantsEx.au3>

Global $i = 0

$GUI = GUICreate("", 200, 100)
$button1 = GUICtrlCreateButton('0 (1-100)', 50, 40, 90, 20)
GUISetState(@SW_SHOW, $GUI)

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
		Case $button1
			If $i = 0 Then
				_FileRewrite(@ScriptDir & '\' & @UserName & '.txt', '0')
				$i = 1
			Else
				_FileRewrite(@ScriptDir & '\' & @UserName & '.txt', Round(Random(2, 100)))
			EndIf
	EndSwitch
WEnd

Func _FileRewrite($sFile, $sData)
	Local $hFile = FileOpen($sFile, 2)
	FileWrite($hFile, $sData)
	Return FileClose($hFile)
EndFunc
 
Автор
A

agikon

Знающий
Сообщения
789
Репутация
17
---Zak---
Ах вот оно что!
Спасибо заработало!

CreatoR
Спасибо за интересный и компактный вариант.

Но вот почему такой вариант не работает?
Вот смотрите, что если имя файла некая переменная которую надо сохранить, и повторно её указать не получится. вот например вот такой вариант.

Код:
#include <GUIConstantsEx.au3>
$GUI = GUICreate("", 200, 100)
GUISetState(@SW_SHOW, $GUI)

$button1 = GUICtrlCreateButton('0 (1-100)', 50, 40, 90, 20)
$i = 0

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
        Case $button1
            if $i = 0 then
				$random = round(random(1,100)) ;имя  файла выбирается рандомно
                $1 = FileOpen(@ScriptDir & '\'&$random&'.txt', 2)
                FileWrite($1,'0')
                FileClose($1)
                $i = 1
            else
                $rand = round(random(1,100))
                $00 = FileOpen($1) ;вот эта строчка не работает
                FileWrite($00,$rand)
                FileClose($00)
            endif
    EndSwitch
WEnd
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
agikon [?]
что если имя файла некая переменная которую надо сохранить, и повторно её указать не получится
Почему нет?

вот такой вариант
Неправильный вариант.
В FileOpen нужно передавать не дескриптор открытого файла, а путь к файлу.

Код:
#include <GUIConstantsEx.au3>

Global $sFile
Global $i = 0

$GUI = GUICreate("", 200, 100)
$button1 = GUICtrlCreateButton('0 (1-100)', 50, 40, 90, 20)
GUISetState(@SW_SHOW, $GUI)

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
		Case $button1
			If $i = 0 Then
				$sFile = @DesktopDir & '\' & Round(Random(1, 100)) & '.txt'
				_FileRewrite($sFile, '0')
				$i = 1
			Else
				_FileRewrite($sFile, Round(Random(2, 100)))
			EndIf
	EndSwitch
WEnd

Func _FileRewrite($sFile, $sData)
	Local $hFile = FileOpen($sFile, 2)
	FileWrite($hFile, $sData)
	Return FileClose($hFile)
EndFunc
 
Автор
A

agikon

Знающий
Сообщения
789
Репутация
17
CreatoR
В FileOpen нужно передавать не дескриптор открытого файла, а путь к файлу.

А вот оно что! Теперь понял где ошибку делал.
Спасибо.
 
Верх