Перед именем файла вставляем префикс "\\?\" — в Win7 и Win10 работает.Некоторые функции приводят к ошибкам при работе с длинными именами файлов. Какие существуют приёмы для борьбы с этим явлением?
#pragma compile(Console, True)
#pragma compile(UPX, False)
Opt('MustDeclareVars', True)
Local $sName, $sExtraLong, $hFile
;
$sName = @ScriptDir & '\zxcvaeroiyerpyieprtiyeroyiwyilfpowieylwpoiywe[iy[ti,w]piyqw]p\weoriutwpoeriyuwpuypweoruywpoeriuywpoeriuctqwpoiutkpcwoierutpvwoeiruwpvoituywjver\paiwrupaeiorutpqorweiuqnweixuqiweurytocqiuryefmpaiuycpaiuyecfgmq\35468er7yw98r7ya69er8y7aqe65rfh4bz6df57yud6gyk4d68tf7ya68er7y6a8e7t4h35b4zdf357g8asefy7\zzz.txt'
$hFile = FileOpen($sName)
ConsoleWrite($hFile & @CRLF)
ConsoleWrite(FileRead($hFile) & @CRLF)
FileClose($hFile)
;
$sExtraLong = '\\?\' & $sName
$hFile = FileOpen($sExtraLong)
ConsoleWrite($hFile & @CRLF)
ConsoleWrite(FileRead($hFile) & @CRLF)
FileClose($hFile)
Exit
Вы правы «на все 146%» ©, без шуток и приколов. Однако ж согласно ссылке сие актуально только под Win10+…
Ну состоит отметить, если это для личного пользования то вполне рабоче. Так же из личного опыта сейчас в большинстве случаев у всех стоит win10 и выше.Вы правы «на все 146%» ©, без шуток и приколов. Однако ж согласно ссылке сие актуально только под Win10+…
Т.о. ковыряйте реестр и/или системные политики. Ежели Вам кто-то позволит это делать
И таки да, не факт, что на чужом компе есть Win10 вообще и её = Wind'ы = нужные настройки в частности…
Не совсем: меняя настройку, которая позволяет длинные имена, открываем также и право создания ещё более длинных имён сторонними программами. По такому пути поэтому не хотелось идти изначально.Ну состоит отметить, если это для личного пользования то вполне рабоче.
AutoItSetOption()
, изменяющий это поведение. Если с этим нет никаких подводных камней (типа замедления работы, ошибок в случае слишком коротких имён или чего-то в этом роде), то можно предложить разработчикам языка.Всё-таки не всегда помогает. :-(Перед именем файла вставляем префикс "\\?\"
#include <File.au3>
#include <WinAPIShellEx.au3>
$sPath = "\\?\C:\Tmp\"
For $i = 11 To 95
$sPath &= "w" & $i
Next
_FileCreate($sPath)
_WinAPI_ShellOpenFolderAndSelectItems($sPath)
MsgBox(4096, "", "Script terminated.")
#include <File.au3>
#include <WinAPIShellEx.au3>
$sPath = "C:\Tmp\"
For $i = 11 To 94
$sPath &= "w" & $i
Next
_FileCreate($sPath)
_WinAPI_ShellOpenFolderAndSelectItems($sPath)
MsgBox(4096, "", "Script terminated.")
А оказывается мой метод не такой уж и плохой, да ? :DНе совсем: меняя настройку, которая позволяет длинные имена, открываем также и право создания ещё более длинных имён сторонними программами. По такому пути поэтому не хотелось идти изначально.
Решение с префиксом "\\?\" лично меня устроило. Microsoft обещает работу этого решения только начиная с определённой сборки системы. Если станет постоянным стандартом, то почему бы не вставлять этот префикс автоматически в код каждой функции? Возможно, удобнее будет добавить параметр дляAutoItSetOption()
, изменяющий это поведение. Если с этим нет никаких подводных камней (типа замедления работы, ошибок в случае слишком коротких имён или чего-то в этом роде), то можно предложить разработчикам языка.
Сообщение автоматически объединено:
Всё-таки не всегда помогает. :-(Функция из библиотеки "WinAPIShellEx" свою работу не выполняет, тогда как функция из библиотеки "File" срабатывает. Если убрать префикс, сократив имя файла, то работает.Код:#include <File.au3> #include <WinAPIShellEx.au3> $sPath = "\\?\C:\Tmp\" For $i = 11 To 95 $sPath &= "w" & $i Next _FileCreate($sPath) _WinAPI_ShellOpenFolderAndSelectItems($sPath) MsgBox(4096, "", "Script terminated.")
Код:#include <File.au3> #include <WinAPIShellEx.au3> $sPath = "C:\Tmp\" For $i = 11 To 94 $sPath &= "w" & $i Next _FileCreate($sPath) _WinAPI_ShellOpenFolderAndSelectItems($sPath) MsgBox(4096, "", "Script terminated.")
Присваивать себе метод, который в поиске без указания на AutoIt выскакивает первым, а потому прочитан до создания топика, это сильно. Если бы хотя бы скрипт, автоматизирующий эти редактирования туда-сюда, был предложен, то ещё куда ни шло. А не линк на статью, в котором, кстати, оба метода указаны.А оказывается мой метод не такой уж и плохой, да ? :D
Тем более, что вам мешает только если нужно редактировать реестр и после возвращать в исходное состояние, да скорость чуть упадёт, но проблему решит.
Автор темы | Похожие темы | Форум | Ответы | Дата |
---|---|---|---|---|
#pragma compile не работает | Общие вопросы по AutoIt | 4 | ||
R | cURL не работает в билде | Общие вопросы по AutoIt | 0 | |
B | Работа с архивами на autoit | Общие вопросы по AutoIt | 1 | |
B | Работа с FileOperations | Общие вопросы по AutoIt | 5 | |
A | Замена значений, работа в папке, улучшить скрипт | Стол заказов | 2 |