ПРОГРЕСС - Проверка пути вывода файла, введенного пользователем

Я написал код ПРОГРЕССА, который выводит некоторые данные в пользовательский файл. Сами данные не важны, процесс вывода работает нормально. Это в основном

ОПРЕДЕЛЕНИЕ ПЕРЕМЕННОЙ filePath. UPDATE filePath / * Пользователь вводит что-то вроде C: \ UserAccount \ New.txt * / OUTPUT TO (VALUE) filePath.

Что отлично работает, во входном каталоге создается текстовый файл. У меня вопрос:

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

Мы будем благодарны за любой вклад или обратную связь.


person user2961924    schedule 06.11.2013    source источник
comment
Вы имеете в виду ВЫВОД ДЛЯ ЗНАЧЕНИЯ (filePath). ?   -  person Tim Kuehn    schedule 06.11.2013


Ответы (2)


ИНФОРМАЦИЯ О ФАЙЛЕ

Использование системного дескриптора 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.

ИМЯ-ФАЙЛА: ТИП ФАЙЛА начинается с буквы D для каталогов и F для простых файлов. Он также включает информацию о правах чтения и записи. Обратитесь к справке для получения дополнительной информации. Если файл не существует, все атрибуты, кроме ИМЯ ФАЙЛА, будут пустыми или неизвестными (?).

Изменить: кажется, что в некоторых случаях FILE-TYPE возвращает 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.

ПОИСК

При проверке одного файла будет работать команда ПОИСК. Если файл существует, он возвращает полный путь. Однако он не работает с каталогом, только с файлами. Если вы ПОИСК без полного пути, например 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.
person Jensd    schedule 07.11.2013

В символьном поле SYSTEM-DIALOG GET-FILE есть опция MUST-EXIST, если вы хотите использовать 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.
person AquaAlex    schedule 07.11.2013
comment
Чтобы уточнить: используется SYSTEM-DIALOG GET-FILE, откройте диалоговое окно Open File на уровне операционной системы, где пользователь может выбрать файл. Хорошо, когда вы этого хотите, но не всегда (файлы журналов, пакетные отчеты и т. Д.). - person Jensd; 07.11.2013