Что нового

[Баг] FileOpen, FileRead и т.д. не открывают занятый файл???

Автор
M

Manonegro

Новичок
Сообщения
24
Репутация
0
Ну вот, танцы с бубном начались... ;D
Администраторы, каков вердикт???
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Manonegro [?]
Администраторы, каков вердикт?
Вердикт таков:

Приведите полный рабочий пример воспроизведения бага, иначе нечего даже обсуждать.
 
Автор
M

Manonegro

Новичок
Сообщения
24
Репутация
0
Приведите полный рабочий пример воспроизведения бага, иначе нечего даже обсуждать.

Ничего не понимаю. :blink: А разве двух страниц примеров мало? Какой "полный рабочий пример" Вы ожидаете увидеть? Всё просто:

Код:
$NameLogFile = 'C:\Program Files\TeamViewer\Version5\TeamViewer5_Logfile.log'
$File = FileRead($NameLogFile)


Не открывает файл, говорит, что "...файл используется другим процессом...", хотя любой другой программой (текстовым редактором и т.д.) файл открывается без проблем. Т.о. налицо некорректная работа в т.н. share-режиме на этапе получения хэндла файла. В предпоследней (3.3.2.0) версии такой проблемы не возникало. Указанная проблема присутствует и в последней бэта-версии(3.3.5.1).

Если что-то неправильно понял, поправьте меня.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Manonegro [?]
Какой "полный рабочий пример" Вы ожидаете увидеть? Всё прост
У меня этот пример не работает, в силу того что нет файла по указанному пути, это и имелось в виду, нужен рабочий пример, чтобы я запустил и увидел проблему, разработчики AutoIt'а не отнесутся с серъёзностью к подобным багам (без конкретного примера воспроизведения).
 
Автор
M

Manonegro

Новичок
Сообщения
24
Репутация
0
Ну вот, собственно:

Код:
#include <WinAPI.au3>

FileChangeDir(@WindowsDir)
$search = FileFindFirstFile('*.log')

While 1
	$file = FileFindNextFile($search)
	$Handle = FileOpen($file, 0)
 	If $Handle = -1 Then ExitLoop
	FileClose($Handle)
Wend

MsgBox(4096, 'Error!', _WinAPI_GetLastErrorMessage() & '   ' & $file)
Exit


У меня нашёл файл Sti_Trace.log. Блокнотом открыл спокойно.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Я изменил пример, а _WinAPI_GetLastErrorMessage() здесь вообще ни к месту.

Код:
$hSearch = FileFindFirstFile(@WindowsDir & '\*.log')
If @error Then
	Exit
EndIf
While 1
	$sFile = FileFindNextFile($hSearch)
	If @error Then
		Exit
	EndIf
	ConsoleWrite($sFile & ' - ')
	$hFile = FileOpen(@WindowsDir & '\' & $sFile, 0)
	If $hFile = -1 Then
		ConsoleWrite('Error!')
	Else
		ConsoleWrite('OK')
	EndIf
	FileClose($hFile)
	ConsoleWrite(@CR)
WEnd


У меня все OK.

Windows XP SP2 (права администратора), AutoIt 3.3.4.0
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Yashied [?]
А у меня с этим примером 4 файла Error...

Sti_Trace.log - Error!
wiaservc.log - Error!
wiadebug.log - Error!
WindowsUpdate.log - Error!

FileOpen действительно могла бы и обрабатывать эти файлы:

Код:
#include <WinAPI.au3>

$hSearch = FileFindFirstFile(@WindowsDir & '\*.log')
If @error Then
    Exit
EndIf

While 1
	$sFile = FileFindNextFile($hSearch)
	If @error Then
		Exit
	EndIf
	
	;$hFile = FileOpen(@WindowsDir & '\' & $sFile, 0)
	$hFile = _WinAPI_CreateFile(@WindowsDir & '\' & $sFile, 2, 2, 6)
	
	If $hFile <= 0 Then
		ConsoleWrite($sFile & ' - Error!' & @CRLF)
	Else
		ConsoleWrite($sFile & ' - OK' & @CRLF)
	EndIf
	
	;FileClose($hFile)
	_WinAPI_CloseHandle($hFile)
WEnd


Если WinAPI справляется с этой задачей, то почеу FileOpen не может это делать - как минимум должен быть дополнительный параметр доступа к файлу (Access).
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Если это работает

_WinAPI_CreateFile(@WindowsDir & '\' & $sFile, 2, 2, 6),

то логично написать

FileOpen(@WindowsDir & '\' & $sFile, 2 1)

CreatoR, можешь это проверить? У меня, как всегда все OK.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Ну да, не то написал.

:-[

FileOpen(@WindowsDir & '\' & $sFile, 1)

У себя запускал с 2, хорошо, что это только логи...

:whistle:


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

У меня вообще всегда OK.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Yashied [?]
FileOpen(@WindowsDir & '\' & $sFile, 1)
Тоже самое, файл не открывается.

P.S
Проблема в том что в версий 3.3.2.0 и ниже этого бага не замечается, т.ч это нечто новое - проверил на всех версиях после 3.3.2.0...
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
А как в таком случае мне воспроизвести этот баг? На моих трех компьютерах все OK. Не факт, что у разработчиков будет Error!
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Вот скрипт воспроизводящий проблему:

Код:
#include <WinAPI.au3>
#include <Debug.au3>

ConsoleWrite("_DebugBugReportEnv: " & _DebugBugReportEnv() & @CRLF & @CRLF)

FileChangeDir(@DesktopDir)
$sFile = "test.txt"

$hTmpFileOpen = FileOpen($sFile, 1)

$hFile = FileOpen($sFile, 0)
;$hFile = _WinAPI_CreateFile($sFile, 2, 2, 6)

If $hFile = -1 Then
	ConsoleWrite($sFile & ' - Error!' & @CRLF)
Else
	ConsoleWrite($sFile & ' - OK' & @CRLF)
EndIf

FileClose($hFile)
FileClose($hTmpFileOpen)
;_WinAPI_CloseHandle($hFile)


Запуск #1:
_DebugBugReportEnv: AutoIt:3.3.2.0 (Os:WIN_XP/X86/Service Pack 2 Language:0419 Keyboard:00000409 Cpu:X86)

test.txt - OK

Запуск #2:
_DebugBugReportEnv: AutoIt:3.3.4.0 (Os:WIN_XP/X86/Service Pack 2 Language:0419 Keyboard:00000409 Cpu:X86)

test.txt - Error!

Если во втором запуске (версия AutoIt: 3.3.4.0) заменить FileOpen на WinAPI то возвращает тот же результат что и в первом запуске (версия AutoIt: 3.3.2.0).
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Хмм... Да, действительно, что-то странное. Ну что, оформляй.
 

CreatoR

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

На эту тему также есть тикет где просят добавить флаг для доступа к файлу, но Valik видимо испытывает трудности понимания репортёра :laugh: т.ч остаётся ждать и надеятся что добавят то что нам нужно.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
CreatoR [?]
т.к доступа к подобным файлам быть не должно
в таком случае, надо полагать что AutoIt впереди планеты всей, т.к.
1. все остальные редакторы прекрасно имеют доступ к подобного рода файлам
2. даже если прямой доступ к файлу занятому другим процессом это моветон, все равно должен быть доступ в режиме ReadOnly - ИМХО :smile:
а вообще, если вернуться в файлу обозначенному в теме, сама программа не блокирует данные файл, т.к. файл прекрасно редактируется извне.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Вообще, за доступ к файлу отвечает параметер $iShare. Программа сама выбирает давать этот доступ другим приложением или нет.

_WinAPI_CreateFile($sFileName, $iCreation [, $iAccess = 4 [, $iShare = 0 [, $iAttributes = 0 [, $pSecurity = 0]]]])
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Если приложение разрешает доступ к открытому файлу посредством $iShare, то другие программы должны иметь доступ к этому файлу в соответствии с этим параметром. IMHO Valik что-то перемудрил...
 
Верх