Rebol2: изменение каталога на абсолютный путь к файлу не работает

#directory #filepath #absolute #rebol #rebol2

#каталог #путь к файлу #абсолютный #перезагрузка #rebol2

Вопрос:

Я пытаюсь прочитать путь к файлу из файла конфигурации, а затем прочитать из этого каталога. Я не могу найти способ заставить это работать, потому что по какой-то причине change-dir никогда не переходит к абсолютному пути к файлу. Вот расшифровка того, как я пытаюсь заставить это работать в командной строке.

 >> test: pick read/lines %test.ini 1
== "test: C/Users/thompson/Downloads/"
>> test: find test " "
== " C/Users/thompson/Downloads/"
>> test: next test
== "C/Users/thompson/Downloads/"
>> test: to file! test
== %C/Users/thompson/Downloads/
>> change-dir test
** Access Error: Cannot open /C/rscratch/C/Users/thompson/Downloads/
** Near: change-dir test
  

Ответ №1:

Сбой, потому что Rebol не видит

 %C/Users/thompson/Downloads/
  

как абсолютный путь — в нем отсутствует волшебная косая черта, поэтому он рассматривается как относительный путь. Абсолютный путь — это:

 %/C/Users/thompson/Downloads/
  

Так легко исправить, если вы уверены, что у вас нет этой косой черты:

 >> test: pick read/lines %test.ini 1
== "test: C/Users/thompson/Downloads/"
>> test: find test " "
== " C/Users/thompson/Downloads/"
>> test: next test
== "C/Users/thompson/Downloads/"
>> test: to file! join "/" test
  

Ответ №2:

Есть много способов получить абсолютный путь к файлу Rebol,

способ перезаписи

  test: "test: %/C/Users/thompson/Downloads/"
 select load test [test:]
  

способ Linux

 test: "test: /C/Users/thompson/Downloads/"
to-file trim find/tail test "test:"
  

способ Windows

 test: "test: C:/Users/thompson/Downloads/"
to-rebol-file trim find/tail test "test:"
  

Вы всегда будете получать %/C/Users/thompson/Downloads/

Ответ №3:

Найдено эффективное решение.

 changeDirAbsolute: func [input] [
change-dir %/
change-dir input
]
  

Если у кого-нибудь есть более элегантное решение, я готов его выслушать!

Ответ №4:

В Rebol, поскольку код — это данные, а данные — это код, вы можете представлять свои файлы .ini с помощью кода Rebol. Кстати, я и многие другие, кто не ориентирован на Windows, предпочитаем использовать .cfg в качестве расширения для этих типов файлов. .ini относится к «инициализации», которая во многих умах относится к загрузке системы, но также может относиться к запуску программы. .cfg немного более точен в том смысле, что это файл конфигурации для программы.

С учетом сказанного, попробуйте это вместо:

test.cfg:

 test: %/c/users/thompson/downloads
  

Затем вы можете просто сделать это из своей программы:

 >> do %test.cfg
  

Это автоматически заполнит путь к файлу словом ‘test.

В операционных системах, не основанных на Windows, чаще всего путь к файлу начинается с /, когда он ссылается на корневой уровень файловой системы. Если он не начинается с /, это относительный путь (начиная с текущего каталога).

Я надеюсь, что это поможет!