2013-11-06 6 views
2

Я написал код PROGRESS, который выводит некоторые данные в файл, определенный пользователем. Сами данные не важны, выходной процесс работает нормально. Это в основномPROGRESS - Проверка пути вывода файла пользователя

DEFINE VARIABLE filePath. UPDATE filePath/* Типы пользователей в чем-то вроде C: \ UserAccount \ New.txt */ OUTPUT TO (VALUE) filePath.

Что хорошо работает, в каталоге ввода создается txt-файл. Мой вопрос:

Есть ли у прогресса какие-либо функциональные возможности, которые позволили бы мне проверить, действителен ли путь ввода ? (В частности, если у пользователя есть допустимый каталог и если у них есть разрешение на создание файла в выбранном им каталоге)

Любой вход или отзыв будут оценены.

+0

Вы имеете в виду ВЫХОД НА ЗНАЧЕНИЕ (filePath). ? –

ответ

3

FILE-INFO

Использование системы ручки FILE-INFO дает много информации. Он также работает в каталогах.

FILE-INFO:FILE-NAME = "c:\temp\test.p". 

DISPLAY 
    FILE-INFO:FILE-NAME 
    FILE-INFO:FILE-CREATE-DATE 
    FILE-INFO:FILE-MOD-DATE 
    FILE-INFO:FILE-INFO 
    FILE-INFO:FILE-MOD-TIME 
    FILE-INFO:FILE-SIZE 
    FILE-NAME:FILE-TYPE 
    FILE-INFO:FULL-PATHNAME 
     WITH FRAME f1 1 COLUMN SIDE-LABELS. 

Простая проверка для существующего каталога с правами записи может быть что-то вроде:

FUNCTION dirOK RETURNS LOGICAL (INPUT pcDir AS CHARACTER): 

    FILE-INFO:FILE-NAME = pcDir. 

    IF INDEX(FILE-INFO:FILE-TYPE, "D") > 0 
    AND INDEX(FILE-INFO:FILE-TYPE, "W") > 0 THEN 
     RETURN TRUE. 
    ELSE 
     RETURN FALSE. 
END FUNCTION. 

FILE-NAME: FILE-TYPE будет начинаться с D для каталогов и F для обычных файлов. Он также содержит информацию о правах на чтение и запись. Обратитесь за помощью для получения дополнительной информации. Если файл не существует, то все атрибуты, кроме FILE-NAME, будут пустыми или неизвестными (?).

Edit: мне кажется, что тип файла возвращает W в некоторых случаях, даже если нет никаких реальных прав пишущих в этой директории, так что я вам, возможно, придется справиться с этим в процессе обработки ошибок вместо

ОШИБКИ ОБРАБОТКА

OUTPUT TO VALUE("f:\personal\test.txt"). 
PUT UNFORMATTED "Test" SKIP. 
OUTPUT CLOSE. 


CATCH eAnyError AS Progress.Lang.ERROR: 
/* Here you could check for specifically error no 98 indicating a problem opening the file */ 
MESSAGE 
    "Error message and number retrieved from error object..."  
    eAnyError:GetMessage(1) 
    eAnyError:GetMessageNum(1)  VIEW-AS ALERT-BOX BUTTONS OK. 

END CATCH. 

FINALLY: 

END FINALLY. 

ПОИСК

При проверке одного файла, SE Команда ARCH будет работать. Если файл существует, он возвращает полный путь. Однако он не работает в каталоге, а только в файлах. Если вы ПОИСК без полного пути e g SEARCH("test.p"), команда выполнит поиск по каталогам, установленным в переменной среды PROPATH, и вернет первую соответствующую запись с полным путем. Если нет совпадения, оно вернет неизвестное значение (?).

Синтаксис:

IF SEARCH("c:\temp\test.p") = ? THEN 
    MESSAGE "No such file" VIEW-AS ALERT-BOX ERROR. 
ELSE 
    MESSAGE "OK" VIEW-AS ALERT-BOX INFORMATION. 
1

SYSTEM-DIALOG GET-FILE символьного поля имеет возможность ДОЛЖНА-СУЩЕСТВУЕТ, если вы хотите использовать dailogue, чтобы получить имя файла/реж от пользователя. Пример из руководства

DEFINE VARIABLE procname AS CHARACTER NO-UNDO. 
DEFINE VARIABLE OKpressed AS LOGICAL INITIAL TRUE. 
    Main: 
    REPEAT:  
     SYSTEM-DIALOG GET-FILE procname   
      TITLE  "Choose Procedure to Run ..."   
      FILTERS "Source Files (*.p)" "*.p",     
         "R-code Files (*.r)" "*.r"   
      MUST-EXIST   
      USE-FILENAME   
      UPDATE OKpressed.   
     IF OKpressed = TRUE THEN   
      RUN VALUE(procname).  
     ELSE    
      LEAVE Main.    
END. 
+1

Для уточнения: используется SYSTEM-DIALOG GET-FILE, откройте диалоговое окно «Открыть файл» уровня os, где пользователь может выбрать файл. Хорошо, когда это вы хотите, но не всегда (файлы журналов, пакетные отчеты и т. Д. И т. Д.). – Jensd

Смежные вопросы