Что нового

Ошибки файловых функций в версии 3.3.8.0

asdf8

Скриптер
Сообщения
564
Репутация
152
Во-первых, при присвоении файлу атрибута HIDDEN или SYSTEM добавляется еще атрибут ARCHIVE.
Во-вторых, нельзя открыть на запись файл с атрибутом HIDDEN или SYSTEM.

Пример:
Код:
$file = FileOpen(@ScriptDir & '\Test.txt', 10)
FileWrite($file, 'Text')
FileClose($file)

FileSetAttrib(@ScriptDir & '\Test.txt', '+H')

$file = FileOpen(@ScriptDir & '\Test.txt', 2)
If $file = -1 Then
	ConsoleWrite('!> error open file: Attrib = ' & FileGetAttrib(@ScriptDir & '\Test.txt') & @CRLF)
Else
	FileClose($file)
EndIf

ConsoleWrite('-> FileDelete = ' & FileDelete(@ScriptDir & '\Test.txt') & @CRLF)

ps: проверял на xp sp3
 

CreatoR

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

CreatoR

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


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

Мда, как только создал тикет я понял что это совсем не баг.

Когда мы создаём файл, он уже имеет атрибут Archive, т.ч FileSetAttrib тут не причём.

Код:
$sFile = @DesktopDir & '\Test.txt'

FileDelete($sFile)

$hFile = FileOpen($sFile, 2)
FileWrite($hFile, 'Text')
FileClose($hFile)

ConsoleWrite('-> Attrib After File Created = ' & FileGetAttrib($sFile) & @CRLF)
FileSetAttrib($sFile, '-A')
FileSetAttrib($sFile, '+H')
ConsoleWrite('-> Attrib After FileSetAttrib(+H) = ' & FileGetAttrib($sFile) & @CRLF)

FileDelete($sFile)
 
Автор
A

asdf8

Скриптер
Сообщения
564
Репутация
152
Проверил AutoIt от последней версии до 3.2.10.0 - оказалось, все они не могут открыть на запись скрытый файл.
Можно это считать запросом на новую функцию?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Здесь все подробно написано. Поскольку FileOpen() в режиме записи по-любому создает файл (написано в справке), то это равносильно режиму CREATE_ALWAYS в API. При этом, если файл имеет атрибут FILE_ATTRIBUTE_HIDDEN, то возвращается ошибка ERROR_ACCESS_DENIED.
 
Автор
A

asdf8

Скриптер
Сообщения
564
Репутация
152
AZJIO [?]
В ответ можно получить типа "сними атрибут, запиши, восстанови атрибут"
Скорее всего - да, но если спросить, то появится минимальный шанс, что что-нибудь изменят.
И еще, не очень удобно, что ошибку функции FileOpen нужно отслеживать по возвращаемому значению, а не по @Error

Yashied [?]
Здесь все подробно написано. Поскольку FileOpen() в режиме записи по-любому создает файл (написано в справке), то это равносильно режиму CREATE_ALWAYS в API. При этом, если файл имеет атрибут FILE_ATTRIBUTE_HIDDEN, то возвращается ошибка ERROR_ACCESS_DENIED.

по msdn чтобы создать простое окно, нужно проделать кучу шагов и прикрутить свой обработчик, на то AutoIt и является языком высокого уровня.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Я не призываю использовать API, просто объяснил суть проблемы. FileOpen(), это фактически обертка для CreateFile(). Другого не существует. Можете пока использовать следующую функцию вместо флага 2 (с флагом 1 FileOpen() открывает скрытые файлы).

Код:
#Include <APIConstants.au3>
#Include <WinAPIEx.au3>

_FileTruncate(@ScriptDir & '\Test.txt')
$hFile = FileOpen(@ScriptDir & '\Test.txt', 1)

...

Func _FileTruncate($sFile)
	Local $hFile = _WinAPI_CreateFileEx($sFile, $TRUNCATE_EXISTING, $GENERIC_WRITE, $FILE_SHARE_READ)
	If @error Then
		Return SetError(1, 0, 0)
	EndIf
	_WinAPI_CloseHandle($hFile)
	Return 1
EndFunc   ;==>_FileTruncate
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
asdf8 [?]
на то AutoIt и является языком высокого уровня
:blink:
Он как раз таки является языком низкого уровня.
Возможно имелось в виду «удобным языком»?
 

Yashied

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

CreatoR

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

Yashied

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

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Yashied [?]
ЯП низкого уровня - ассемблер. AutoIt находится где-то между высоким и сверхвысоким уровнем.
:blink: а как это между?
самый настоящий VHLL, как и большинство других скриптовых
 
Верх