Оберон-клуб «ВЄДАsoft»
https://zx.oberon.org/forum/

Как определить существует ли файл в рабочем каталоге?
https://zx.oberon.org/forum/viewtopic.php?f=79&t=464
Страница 1 из 1

Автор:  Len [ 28 июл 2019, 11:10 ]
Заголовок сообщения:  Как определить существует ли файл в рабочем каталоге?

Подскажите, как определить существует ли файл и как узнать путь к рабочему каталогу?

Автор:  SovietPony [ 28 июл 2019, 16:19 ]
Заголовок сообщения:  Re: Как определить существует ли файл в рабочем каталоге?

Len писал(а):
определить существует ли файл
Эффективнее и надёжнее всего использовать платформозависимый код.
В платформонезависимом виде лучше всего использовать Files.Directory.FileList.
Len писал(а):
узнать путь к рабочему каталогу
В полностью платформонезависимом виде не получится.
Но можно использовать такой код как минимум для win32:
Код: "OBERON"
  1.  
  2. VAR path: HostFiles.FullName;
  3. ...
  4. path := Files.dir.This("")(HostFiles.Locator).path$
  5.  

Автор:  Zorko [ 28 июл 2019, 18:32 ]
Заголовок сообщения:  Re: Как определить существует ли файл в рабочем каталоге?

Len писал(а):
Подскажите, как определить существует ли файл
Код: "OBERON"
  1. IMPORT WinApi;
  2.  
  3. PROCEDURE FileExists* (IN dirName: ARRAY OF CHAR): BOOLEAN;
  4. CONST
  5. INVALID_FILE_ATTRIBUTES = -1;
  6. VAR
  7. dwAttrib: INTEGER;
  8. BEGIN
  9. dwAttrib := WinApi.GetFileAttributesW(dirName);
  10. RETURN (dwAttrib # INVALID_FILE_ATTRIBUTES) (* wrong path! *)
  11. & (BITS(dwAttrib) * WinApi.FILE_ATTRIBUTE_DIRECTORY = {})
  12. END FileExists;

Len писал(а):
и как узнать путь к рабочему каталогу?
Код: "OBERON"
  1. (* GetCurrentDir returns the current directory the program is using. *)
  2.  
  3. PROCEDURE GetCurrentDir* (VAR curdir: ARRAY OF CHAR): BOOLEAN;
  4. BEGIN
  5. RETURN WinApi.GetCurrentDirectoryW(LEN(curdir), curdir) > 0
  6. END GetCurrentDir;

Автор:  Len [ 18 авг 2019, 13:17 ]
Заголовок сообщения:  Re: Как определить существует ли файл в рабочем каталоге?

WinApi.GetFileAttributesW(dirName) к сожалению выдаёт -1, если в dirName встречается кириллица.

Автор:  Len [ 18 авг 2019, 15:25 ]
Заголовок сообщения:  Re: Как определить существует ли файл в рабочем каталоге?

Кстати,
Код: "OBERON"
  1. VAR
  2. loc: Files.Locator;
  3. fi: Files.FileInfo;
  4. path: ARRAY 256 OF CHAR;
  5. BEGIN
  6. path := (*в адресе присутствует кириллица*)
  7. loc := Files.dir.This(path);
  8. fi := Files.dir.FileList(loc);
  9.  

Далее fi = NIL, однако если в адресе нет кириллицы то всё работает.

Автор:  SovietPony [ 18 авг 2019, 15:52 ]
Заголовок сообщения:  Re: Как определить существует ли файл в рабочем каталоге?

Похоже винда тонко намекает о том что в использовать кириллицу в путях лучше не надо ;)
А LocList/FileList показывают кириллицу?

Автор:  Zorko [ 18 авг 2019, 20:27 ]
Заголовок сообщения:  Re: Как определить существует ли файл в рабочем каталоге?

Len писал(а):
WinApi.GetFileAttributesW(dirName) к сожалению выдаёт -1, если в dirName встречается кириллица.
Это, однако, странно. А если добавить к пути "\\?\"?

Навскидку в голову приходит идея, что перед вызовом GetFileAttributesW нужно задать правильную кодовую страницу для кириллицы, если она почему-то сбилась. Так что может дело не в самой кириллице?

Ещё можно попробовать предварительно обработать путь при помощи функции GetShortPathNameW (код не тестировал).

Код: "OBERON"
  1. PROCEDURE FileExists* (IN dirName: ARRAY OF CHAR): BOOLEAN;
  2. CONST
  3. INVALID_FILE_ATTRIBUTES = -1;
  4. VAR
  5. dwAttrib: INTEGER; buf: ARRAY WinApi.MAX_PATH OF CHAR;
  6. BEGIN
  7. dwAttrib := WinApi.GetShortPathNameW(dirName, buf, LEN(buf));
  8. dwAttrib := WinApi.GetFileAttributesW(buf);
  9. RETURN (dwAttrib # INVALID_FILE_ATTRIBUTES) (* wrong path! *)
  10. & (BITS(dwAttrib) * WinApi.FILE_ATTRIBUTE_DIRECTORY = {})
  11. END FileExists;

Страница 1 из 1 Часовой пояс: UTC + 2 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/