1

Тема: AHK: Получение полного пути файла из сокращенного (MS DOS).

Добрый день.

При подстановке переменной A_Temp в команды FileDelete и FileRemoveDir удаления не происходит.
Переменная A_Temp содержит сокращённый до 8 символов путь (стандарт DOS). Если путь указывать целиком, не прибегая к A_Temp - то FileDelete работает.

Как получить полный путь (не формата DOS) из переменной A_temp?

Мои разработки: Bsod finder, MyTetra Integrator

2

Re: AHK: Получение полного пути файла из сокращенного (MS DOS).

GetLongPathName.

3

Re: AHK: Получение полного пути файла из сокращенного (MS DOS).

Molotok пишет:

При подстановке переменной A_Temp в команды FileDelete и FileRemoveDir удаления не происходит.

Никогда о такой проблеме не слышал. Покажите, что именно и как подставляете.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

4 (изменено: Molotok, 2018-06-05 17:53:58)

Re: AHK: Получение полного пути файла из сокращенного (MS DOS).

teadrinker
Эта проблема возникает в случае, если имя пользователя (windows) длиннее 8 символов.
Этим кодом кожно наглядно проверить.

Loop, %A_Temp%\*.*, 0, 0
{
w1 = %A_LoopFileFullPath%
MsgBox, %w1%
}
f12::
    ExitApp
    return

Malcev
Спасибо. Нашёл код преобразующий короткое имя в длинное.


GetLongPathName(path)
{
  VarSetCapacity(out, 522)
  DllCall("GetLongPathName", "str", path, "str", out, "uint", 260)
  return out
}

Как проверю - сообщу результат.

Мои разработки: Bsod finder, MyTetra Integrator

5

Re: AHK: Получение полного пути файла из сокращенного (MS DOS).

Всё отлично работает!

b_temp := GetLongPathName(A_Temp)

Loop, %b_temp%\*.*, 0, 0
{
w1 = %A_LoopFileFullPath%
MsgBox, %w1%
}

f12::
    ExitApp
    return
GetLongPathName(path)
{
  VarSetCapacity(out, 522)
  DllCall("GetLongPathName", "str", path, "str", out, "uint", 260)
  return out
}
Мои разработки: Bsod finder, MyTetra Integrator

6

Re: AHK: Получение полного пути файла из сокращенного (MS DOS).

Molotok пишет:

teadrinker
Эта проблема возникает в случае, если имя пользователя (windows) длиннее 8 символов.
Этим кодом кожно наглядно проверить.

Loop, %A_Temp%\*.*, 0, 0
{
w1 = %A_LoopFileFullPath%
MsgBox, %w1%
}
f12::
    ExitApp
    return

В смысле, у вас этот код не возвращает имена файлов? А такой:

Loop, Files, %A_Temp%\*.*
   MsgBox, % A_LoopFilePath
Return

F12:: ExitApp

?

Нашёл код преобразующий короткое имя в длинное

Всё проще:

Loop, files, %A_Temp%, D
   MsgBox, % A_LoopFilePath
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

7 (изменено: Malcev, 2018-06-05 18:35:12)

Re: AHK: Получение полного пути файла из сокращенного (MS DOS).

teadrinker пишет:

Всё проще:

А почему ты используешь A_LoopFilePath, а не A_LoopFileLongPath?

temp := "C:\PROGRA~1\test"
Loop, files, %temp%, D
   MsgBox, % A_LoopFilePath "`n" A_LoopFileLongPath

8

Re: AHK: Получение полного пути файла из сокращенного (MS DOS).

А, верно, A_LoopFileLongPath нужен.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

9

Re: AHK: Получение полного пути файла из сокращенного (MS DOS).

teadrinker
Проблема прекрасно решилась с помощью найденной функции. Использование её выглядит более аккуратным, и можно обойтись без цикла (A_LoopFileLongPath). Но способ достать длинные имена возьму в копилку. Об этом как то даже не думал, поскольку цикл в моем случае не используется. Код с циклом был приведен для примера отображения имен в dos формате.

Мои разработки: Bsod finder, MyTetra Integrator