2015-12-03 75 views
2

我有一個小的STP其中列出了UNIX的服務器上指定目錄下所有文件/子目錄。 問題是,我datastep只返回對象的名稱,但如果這是一個文件或目錄的信息。列出目錄中的所有文件:如何檢測結果是文件還是子目錄?

我嘗試了一些東西,並有一些想法,但非非常萬無一失,也許有人可以給我一個提示如何我可以得到這個。使用FILEEXISTS

  • 我有什麼到目前爲止已經試過這將返回文件和目錄的真實,所以這並不在這裏

  • 工作檢查點。有可能是沒有擴展名的文件(所以沒有一個點),也有名稱中有點的目錄,所以這不是萬無一失的
  • 在sas中使用unixfunctionalities:這是禁止在我們的服務器上,所以沒有我的選項
  • 打開一個文件句柄,並做了FINFO,如果它不是一個文件,但這返回警告

    一)也許它可能是別的東西,然後一個目錄或文件,或因其他原因

    警告

    b)檢查警告類型檢測不是一個好的解決辦法imo

這裏我的代碼的一部分,我現在用:

filename _folder_ "%bquote(&mydirectory/)"; 
data x (keep=filepath); 
    handle=dopen('_folder_'); 
    if handle > 0 then do; 
    count=dnum(handle); 
    do i=1 to count; 
    filepath="&mydirectory"||dread(handle,i); 
    output; 
    end; 
    end; 
    rc=dclose(handle); 
run; 
filename _folder_ clear; 

/*this part just makes a macrovariable with all results*/ 
proc sql noprint; 
    select filepath into: fpath separated by '#' from x; 
quit; 

/* this macro collects some additional fileinformation from all file in macrovariable fpath and creates a HTML-Ouput*/ 
%FileAttribs; 

回答

3

使用FILENAME()功能定義fileref到文件中。這將返回一個代碼來指示文件是否存在。然後使用DOPEN()函數嘗試打開fileref作爲目錄。這會告訴你,如果該文件是一個目錄。

例如這裏是函數式的宏,我使用。

%macro direxist 
/*---------------------------------------------------------------------- 
Test if directory exists 
----------------------------------------------------------------------*/ 
(path /* Name of directory to test for existance */ 
); 
/*---------------------------------------------------------------------- 
Test if directory exists. Returns value 1 or 0. 
1 - Directory exists 
0 - Directory does not exist 

Global macro variable SYSRC will be set to 1 when a file is found 
instead of a directory. 

----------------------------------------------------------------------*/ 
%local return rc did fileref; 
%*---------------------------------------------------------------------- 
Set up return values as normal failure to find path. 
-----------------------------------------------------------------------; 
%let return=0; 
%let sysrc=0; 

%*---------------------------------------------------------------------- 
If path is not specified or does not exist then return normal failure. 
-----------------------------------------------------------------------; 
%if (%bquote(&path) =) %then %goto quit; 
%if ^%sysfunc(fileexist(&path)) %then %goto quit; 

%*---------------------------------------------------------------------- 
Try to open it using DOPEN function. 
Return 1 if it can be opened. 
Otherwise set SYSRC=1 to mean that PATH exists but is not a directory. 
-----------------------------------------------------------------------; 
%if (0=%sysfunc(filename(fileref,&path))) %then %do; 
    %let did=%sysfunc(dopen(&fileref)); 
    %if (&did) %then %do; 
    %let return=1; 
    %let rc=%sysfunc(dclose(&did)); 
    %end; 
    %else %let sysrc=1; 
    %let rc=%sysfunc(filename(fileref)); 
%end; 

%quit: 
%*---------------------------------------------------------------------- 
Return the value as the result of the macro. 
-----------------------------------------------------------------------; 
&return 
%mend; 
+0

Ty,爲我工作,已經在我的宏中有一個文件名和fopen,但沒有得到檢查fid的想法 – kl78

相關問題