Оберон-клуб «ВЄДАsoft»

Твердыня модульных языков
Текущее время: 29 мар 2024, 13:35

Часовой пояс: UTC + 2 часа




Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
СообщениеДобавлено: 28 июл 2019, 11:10 
Не в сети

Сообщения: 116
Откуда: Каменск-Уральский
Подскажите, как определить существует ли файл и как узнать путь к рабочему каталогу?


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 28 июл 2019, 16:19 
Не в сети
Аватара пользователя

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


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 28 июл 2019, 18:32 
Не в сети
Аватара пользователя

Сообщения: 1019
Откуда: Днепропетровская обл.
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;


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 18 авг 2019, 13:17 
Не в сети

Сообщения: 116
Откуда: Каменск-Уральский
WinApi.GetFileAttributesW(dirName) к сожалению выдаёт -1, если в dirName встречается кириллица.


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 18 авг 2019, 15:25 
Не в сети

Сообщения: 116
Откуда: Каменск-Уральский
Кстати,
Код: "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, однако если в адресе нет кириллицы то всё работает.


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 18 авг 2019, 15:52 
Не в сети
Аватара пользователя

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


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 18 авг 2019, 20:27 
Не в сети
Аватара пользователя

Сообщения: 1019
Откуда: Днепропетровская обл.
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;


Вернуться к началу
 Профиль  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Часовой пояс: UTC + 2 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
© VEDAsoft Oberon Club