Что нового

Диалог сохранения файла

Cytrus

Новичок
Сообщения
110
Репутация
3
Привет.

Вот есть функция
Код:
FileSaveDialog
.
Я пытаюсь сохранить файл с именем, которое уже присутствует в папке,
и этот файл имеет атрибут только для чтения.
Я выставляю флаг 16, чтобы выдалось окно на перезапись.
Но система выдаёт, что файл только для чтения.
Я бы дальше разобрался с этим файлом, но я не могу даже возвратить этот выбор в переменную.

На ХР таких проблем не было, а на семёрке вот такая бяка.

У меня права админа, #RequireAdmin установлен.
Может настроить в системе что-то надо?

Что можно сделать?
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Точно, есть проблема. Думаю, что баг. На официальном форуме ничего не нашел.
тут выход такой: заранее снимать атрибут чтение. если, конечно, не предполагается менять имя в диалоговом окне
 

CreatoR

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

Cytrus [?]
Я бы дальше разобрался с этим файлом, но я не могу даже возвратить этот выбор в переменную.
А что разбираться, это ответственность пользователя куда сохранять, если вам нужно конкретный файл, тогда и диалог не нужен.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
CreatoR, это как то обще звучит, системный. Когда копируешь системой, то есть перезапись, тут, получается, система не дает возможности. Разве это системный баг? Функция не справляется, мое мнение.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
joiner [?]
Функция не справляется, мое мнение
Функция вызывает системный диалог, также как и _WinAPI_SaveFileDlg(). Об особенностях работы этого диалога можно почитать здесь (ответ внизу):
https://qa-help.ru/questions/delphi-2007-razreshit-vybor-fajla-tolko-dlya-chteniya-v-tsavedialog
Там хоть и про Delphi, но смысл тот же - функция языка вызывает системный диалог сохранения файла.
 

CreatoR

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

Код:
#include <WinAPIDlg.au3>

$sFile = _WinAPI_SaveFileDlg('Save as', '', 'All (*.*)', 0, '', '', $OFN_OVERWRITEPROMPT)
MsgBox(64, @ScriptName, $sFile)
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
CreatoR [?]
справляется с задачей
У меня на Win7x86 после подтверждения перезаписи следует сообщение о наличии атрибута "только для чтения" и файл не выбирается.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
InnI [?]
У меня на Win7x86 после подтверждения перезаписи следует сообщение о наличии атрибута "только для чтения" и файл не выбирается.
то же самое в обоих вариантах диалога сохранения.
система win 10 x64 с последними обновлениями
 
Сообщения
142
Репутация
-3
Проверил на примере из справки, только заменил цифру 2 на 16 и путь свой поставил. Пробовал указать на имеющийся файл, пробовал ввести руками имя файла. Вернуло имя файла. А вот если поставить галочку у файла "Только для чтения", то напишет, что "Только для чтения". WinApi ведет себя также. Где баг-то?

Как по мне, что чтобы столкнуться с таким, нужно копаться там, куда не звали - в системных файлах.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
joiner [?]
то же самое в обоих вариантах диалога сохранения. система win 10 x64 с последними обновлениями
У меня Win 10 x64, AutoIt 3.3.14.5, файл "Только для чтения" выбирается без проблем (с версией WinAPI).
Странно, я был уверен что оно работает...
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Но мне не понятно, если нужно выбрать файл и что то с ним потом сделать, то почему не использовать FileOpenDialog?
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
CreatoR, проблему можно обойти. но по факту функция диалога сохранения файла не работает как надо. И в стабильной версии и в бета версии языка
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
CreatoR [?]
если нужно выбрать файл и что то с ним потом сделать
А если не нужно? Если есть некие данные, которые необходимо просто сохранить?

joiner [?]
по факту функция диалога сохранения файла не работает как надо
Функция работает как надо - вызывает стандартный диалог Windows. А то, что диалог не позволяет это сделать, так это не проблемы AutoIt. Это нужно в Microsoft обращаться.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
InnI [?]
Функция работает как надо - вызывает стандартный диалог Windows. А то, что диалог не позволяет это сделать, так это не проблемы AutoIt. Это нужно в Microsoft обращаться.
браузер предлагает перезаписать, пэйнт предлагает перезаписать и делают. А вот функция AutoIt не может вернуть путь. Не вижу проблемы со стороны издателя системы. Хотя, разрабам языка, возможно, и стоит обратиться за разъяснением к майкрософту
Смысл функции - вернуть путь. Зачем сложности с диалогами? Если перезапись не произойдет, то кодер будет копать дальше. И придет к снятию атрибута файла.
 
Сообщения
142
Репутация
-3
Всем известный файл host откройте Блокнотом и попробуйте перезаписать. :blum:
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
joiner [?]
браузер предлагает перезаписать, пэйнт предлагает перезаписать и делают
Я попробовал три браузера (IE, Firefox, Torch) и один Paint. Все они предлагают перезаписать, но после нажатия "Да" отображают диалог с текстом "Этот файл доступен только для чтения. Попробуйте сохранить файл под другим именем." и ничего не делают.
 

CreatoR

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

Код:
#include <FileConstants.au3>

$sFile = _FileSaveDialog('Save as', '', 'All Files (*.*)', $FD_PROMPTOVERWRITE)
If @error Then Exit

MsgBox(64, @ScriptName, $sFile)

Func _FileSaveDialog($sTitle, $sInitDir, $sFilter, $iOpts = 0, $sDefName = '', $hWnd = 0)
	Local $sBttn = (@OSLang = 0419 ? 'Сохранить' : 'Save')
	Local $sFile
	
	While 1
		Run(@AutoItExe & " /AutoIt3ExecuteLine ""$v = (WinWait('[CLASS:#32770;REGEXPTITLE:^" & $sTitle & "$]', '', 5) ? ControlSetText('[CLASS:#32770;REGEXPTITLE:^" & $sTitle & "$]', '', 'Button1', '" & $sBttn & "', 1) : 0)""")
		$sFile = FileOpenDialog($sTitle, $sInitDir, $sFilter, $iOpts, $sDefName, $hWnd)
		
		If @error Then
			Return SetError(@error, 0, $sFile)
		EndIf
		
		If BitAND($iOpts, $FD_PROMPTOVERWRITE) And FileExists($sFile) Then
			If MsgBox(52, $sTitle, 'File already exists, overwrite?') = 6 Then
				ExitLoop
			EndIf
			
			$sInitDir = @WorkingDir
			ContinueLoop
		EndIf
		
		ExitLoop
	WEnd
	
	Return $sFile
EndFunc
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
InnI
ты прав, я слегка погорячился. но системой копируется с одним запросом - перезапись. это в отношении файла, которому я поставил атрибут "только чтение". автоит этого не может. ну что тут сделаешь, нет так нет :smile:


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

CreatoR [?]
Вот такой трюк придумал:
отлично
 

CreatoR

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