Что нового

Нет доступа к файлу при повторе выполения функции

MrGep

Новичок
Сообщения
74
Репутация
1
Версия AutoIt: 3.3.6

Описание: Всем доброе время суток. Столкнулся с проблемой. У меня есть функция авторизации, после своего выполнения функция сохраняет файлы. При запуске скрипта первая авторизация проходит удачно, доступ к файлам есть, никаких проблем. Но, при повторной авторизации в тот же запуск скрипта доступа к двум файлам уже нет. Это файл, создаваемые строкой
FileClose(@ScriptDir & "\users\" & $Login & "\temp\" & GUICtrlRead($hCombo) & "\" & GUICtrlRead($hCombo) & ".txt")
и файл ID.txt, создаваемый строкой
FileClose(@ScriptDir & "\users\" & $Login & "\temp\" & $string_combosetdata & "\" & "ID.txt")
Приходится перезапускать скрипт. С чем это может быть связано?



Код:
func Login()
_IENavigate ($oIE,"http://www.voyna-plemyon.ru/game.php")
   $oForm = _IEFormGetCollection($oIE, 0)
            $oPassword = _IEFormElementGetObjByName($oForm,"password")
            $oLogin  = _IEFormElementGetObjByName($oForm,"user")
            $oCheck = _IEGetObjById($oForm, "login_submit_button")
            _IEFormElementSetValue($oLogin, $Login)
            _IEFormElementSetValue($oPassword, $Password)
            _IEAction($oCheck, 'click')
            Sleep(250)
            $oLink = _IELinkGetCollection($oIE, 68)
		    ConsoleWrite('Заходим в ' & _IEPropertyGet($oLink, 'innertext') & @LF)
			GUICtrlSetData($status,"Заходим в игру.")
			$oLink.fireEvent("onmousedown")
			$oLink.fireEvent("onmouseup")
			_IEAction($oLink,'click')
			_IELoadWait($oIE)

			$Captha_text = _IEBodyReadHTML($oIE)

			If StringInStr($Captha_text,"bot_check_image") <> 0 Then
			   _SendMail($BlatArgs)
			MsgBox(0,"Captha!","Капча, ахтунг")
		    EndIf

			$oLink = _IEBodyReadHTML($oIE)
			$Link_name = _IEBodyReadHTML($oIE)


			FileDelete(@ScriptDir & "\users\" & $Login & "\temp" & "\villiages_id.txt")
			FileDelete(@ScriptDir & "\users\" & $Login & "\temp" & "\villiages.txt")
			FileDelete(@ScriptDir & "\users\" & $Login & "\temp" & "\villiages_names.txt")
			DirCreate(@ScriptDir & "\users\" & $Login & "\temp\")
			_FileCreate(@ScriptDir & "\users\" & $Login & "\temp" & "\villiages.txt")
			FileWrite(@ScriptDir & "\users\" & $Login & "\temp" & "\villiages.txt",$oLink)


			Do
			   $nam = StringInStr($Link_name,'<span id="label_text_')
			   ;ConsoleWrite($nam & @LF)
			   $pos = StringInStr($oLink,"'edit_input_")
			   ;ConsoleWrite($pos & @LF)
			   $Link_name = StringTrimLeft($Link_name,$nam+28)
			   ;MsgBox(0,"title", $link_name)
			   $oLink = StringTrimLeft($oLink,$pos+11)
			   $Eject = StringLeft($oLink,5)
			   $Eject_name = StringLeft($Link_name,30)
			   ;MsgBox(0,"title", $Eject_name)
			   ;ConsoleWrite($Link_name & @lf)
			   $exp = StringRegExp($Eject_name,'\d\d\d\|\d\d\d',1)
			   $find = StringInStr($Eject_name,$exp[0])
			   $string_w = StringLeft($Eject_name,$find-2)
			   FileWriteLine(@ScriptDir & "\users\" & $Login & "\temp" & "\villiages_id.txt",$Eject & @CRLF)
			   FileWrite(@ScriptDir & "\users\" & $Login & "\temp" & "\villiages_names.txt",$string_w & " " & $exp[0] & @CRLF)
			Until StringInStr($oLink,"'edit_input_") = 0


			For $i = 1 to _FileCountLines(@ScriptDir & "\users\" & $Login & "\temp" & "\villiages_names.txt")
			    $Combo_setdata = FileReadLine(@ScriptDir & "\users\" & $Login & "\temp" & "\villiages_names.txt",$i)
				$Exp_combo_setdata = StringRegExp($Combo_setdata,'\d\d\d\|\d\d\d',1)
				$find_combo_setdata = StringInStr($Combo_setdata,$Exp_combo_setdata[0])
				$string_combosetdata = StringLeft($Combo_setdata,$find_combo_setdata-3)
			    GUICtrlSetData($hCombo,$string_combosetdata)
				GUICtrlSetData($Villiage_chooser,$string_combosetdata)
				DirRemove(@ScriptDir & "\users\" & $Login & "\temp\" & $string_combosetdata)
				FileDelete(@ScriptDir & "\users\" & $Login & "\temp\" & $string_combosetdata & "\" & $string_combosetdata & ".txt")
				FileDelete(@ScriptDir & "\users\" & $Login & "\temp\" & $string_combosetdata & "\" & "ID.txt")
				DirCreate(@ScriptDir & "\users\" & $Login & "\temp\" & $string_combosetdata)
				FileOpen(@ScriptDir & "\users\" & $Login & "\temp\" & $string_combosetdata & "\" & $string_combosetdata & ".txt",1)
				FileWrite(@ScriptDir & "\users\" & $Login & "\temp\" & $string_combosetdata & "\" & $string_combosetdata & ".txt",$Exp_combo_setdata[0])
				FileOpen(@ScriptDir & "\users\" & $Login & "\temp\" & $string_combosetdata & "\" & "ID.txt",1)
				FileWrite(@ScriptDir & "\users\" & $Login & "\temp\" & $string_combosetdata & "\" & "ID.txt",FileReadLine(@ScriptDir & "\users\" & $Login & "\temp\" & "villiages_id.txt",$i))
			 Next
			FileClose(@ScriptDir & "\users\" & $Login & "\temp\" & $string_combosetdata & "\" & $string_combosetdata & ".txt")
			FileClose(@ScriptDir & "\users\" & $Login & "\temp\" & GUICtrlRead($hCombo) & "\" & GUICtrlRead($hCombo) & ".txt")
			FileClose(@ScriptDir & "\users\" & $Login & "\temp\" & $string_combosetdata & "\" & "ID.txt")
		  EndFunc


Примечания: Заранее прошу прощения, если имеются ошибки при оформлении.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
MrGep,
Прочитайте внимательно описания функций
Код:
FileOpen()
FileClose()
И попробуйте найти свою ошибку.
 

erlik

Продвинутый
Сообщения
317
Репутация
84
С чем это может быть связано
Дескриптор файла не закрыл (дескриптор это не имя файла). А надо бы. И вообще справку читать полезно бывает.
 

_dron_

Знающий
Сообщения
84
Репутация
8
я может зря вмешиваюсь но все равно скажу

Код:
DirRemove(@ScriptDir & "\users\" & $Login & "\temp\" & $string_combosetdata)
                FileDelete(@ScriptDir & "\users\" & $Login & "\temp\" & $string_combosetdata & "\" & $string_combosetdata & ".txt")
                FileDelete(@ScriptDir & "\users\" & $Login & "\temp\" & $string_combosetdata & "\" & "ID.txt")
                DirCreate(@ScriptDir & "\users\" & $Login & "\temp\" & $string_combosetdata)
                FileOpen(@ScriptDir & "\users\" & $Login & "\temp\" & $string_combosetdata & "\" & $string_combosetdata & ".txt",1)


1)DirRemove и FileDelete не в правильной последовательности
2)FileOpen(.. вернет ссылку на файл и заблокирует доступ к нему для других прогам

Код:
FileClose(@ScriptDir & "\users\" & $Login & "\temp\" & $string_combosetdata & "\" & $string_combosetdata & ".txt")
            FileClose(@ScriptDir & "\users\" & $Login & "\temp\" & GUICtrlRead($hCombo) & "\" & GUICtrlRead($hCombo) & ".txt")
            FileClose(@ScriptDir & "\users\" & $Login & "\temp\" & $string_combosetdata & "\" & "ID.txt")


3)FileClose(.. <-- сюда нужна ссылка от FileOpen тогда и файл закроется

Код:
$hFile = FileOpen(@ScriptDir & "\users\" & $Login & "\temp\" & $string_combosetdata & "\" & "ID.txt",$FO_READ )
$sText = FileRead($hFile)
FileClose($hFile);<--------


$hFile = FileOpen(@ScriptDir & "\users\" & $Login & "\temp\" & $string_combosetdata & "\" & "ID.txt",$FO_OVERWRITE )
FileWrite($hFile ,$sText)
FileClose($hFile);<--------
 
Автор
M

MrGep

Новичок
Сообщения
74
Репутация
1
А почему в первый раз все нормально? Я, в общем - то, сначала все через дескрипторы и делал, просто потом когда попробовал напрямую - сработало нормально. Сейчас верну как было, спасибо.
 
Автор
M

MrGep

Новичок
Сообщения
74
Репутация
1
В смысле не открыт? Последовательность

Запуск скрипта
1) Запускаю функцию
2) Удаляю устаревшие файлы(функция удаляет, не я))
3) Открываю новые
4) Записываю данные
5) Закрываю
6) Проверяю сохраненные данные - все записано, все открывается.
Проходит время, я сходил выпил чаю, скрипт никто не трогал.
1)Запускаю функцию
2)Удаляю устаревшие файлы
3)Открываю новые
4)Записываю
5)Закрываю
6)Проверяю сохраненные данные - доступа нет.



Добавлено:
Сообщение автоматически объединено:

Ага, а еще надо было fileclose поместить в цикл))) Чтобы он закрывал каждый файл)) Всем спасибо за внимание и помощь)
 
Верх