⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 find_all_dir.pro

📁 basic median filter simulation
💻 PRO
字号:
        FUNCTION FIND_ALL_DIR, PATH, PATH_FORMAT=PATH_FORMAT,   $                PLUS_REQUIRED=PLUS_REQUIRED, RESET=RESET;+; NAME:;       FIND_ALL_DIR(); PURPOSE:;       Finds all directories under a specified directory.; EXPLANATION:;       This routine finds all the directories in a directory tree when the;       root of the tree is specified.  This provides the same functionality as;       having a directory with a plus in front of it in the environment;       variable IDL_PATH.;; CALLING SEQUENCE:;       Result = FIND_ALL_DIR( PATH );;               PATHS = FIND_ALL_DIR('+mypath', /PATH_FORMAT);               PATHS = FIND_ALL_DIR('+mypath1:+mypath2');; INPUTS:;       PATH    = The path specification for the top directory in the tree.;               Optionally this may begin with the '+' character but the action;               is the same unless the PLUS_REQUIRED keyword is set.;;               One can also path a series of directories separated;               by the correct character ("," for VMS, ":" for Unix);; OUTPUTS:;       The result of the function is a list of directories starting from the;       top directory passed and working downward from there.   Normally, this;       will be a string array with one directory per array element, but if;       the PATH_FORMAT keyword is set, then a single string will be returned,;       in the correct format to be incorporated into !PATH.;; OPTIONAL INPUT KEYWORDS:;       PATH_FORMAT     = If set, then a single string is returned, in;                                 the format of !PATH.;;       PLUS_REQUIRED   = If set, then a leading plus sign is required;                       in order to expand out a directory tree.;                       This is especially useful if the input is a;                       series of directories, where some components;                       should be expanded, but others shouldn't.;;       RESET   = Often FIND_ALL_DIR is used with logical names.  It;               can be rather slow to search through these subdirectories.;               The /RESET keyword can be used to redefine an environment;               variable so that subsequent calls don't need to look for the;               subdirectories.;;               To use /RESET, the PATH parameter must contain the name of a;               *single* environment variable.  For example;;                               setenv,'FITS_DATA=+/datadisk/fits';                               dir = find_all_dir('FITS_DATA',/reset,/plus);;               The /RESET keyword is usually combined with /PLUS_REQUIRED.;; PROCEDURE CALLS:;       DEF_DIRLIST, FIND_WITH_DEF(), BREAK_PATH();; RESTRICTIONS:;       PATH must point to a directory that actually exists.;; REVISION HISTORY:;               Version 11, Zarro (SM&A/GSFC), 23-March-00;                       Removed all calls to IS_DIR;               Version 12, William Thompson, GSFC, 02-Feb-2001;                       In Windows, use built-in expand_path if able.;               Version 13, William Thompson, GSFC, 23-Apr-2002;                       Follow logical links in Unix;                       (Suggested by Pascal Saint-Hilaire);               Version 14, Zarro (EER/GSFC), 26-Oct-2002;                       Saved/restored current directory to protect against;                       often mysterious directory changes caused by ;                       spawning FIND in Unix;               Version 15, William Thompson, GSFC, 9-Feb-2004;                       Resolve environment variables in Windows.;; Version     : Version 16 W. Landsman GSFC Sep 2006;                        Remove VMS support;-;        ON_ERROR, 2        compile_opt idl2;        IF N_PARAMS() NE 1 THEN MESSAGE,        $                'Syntax:  Result = FIND_ALL_DIR( PATH )';-- save current directory   cd,current=current;;  If more than one directory was passed, then call this routine reiteratively.;  Then skip directly to the test for the PATH_FORMAT keyword.;        PATHS = BREAK_PATH(PATH, /NOCURRENT)        IF N_ELEMENTS(PATHS) GT 1 THEN BEGIN                DIRECTORIES = FIND_ALL_DIR(PATHS[0],    $                        PLUS_REQUIRED=PLUS_REQUIRED)                FOR I = 1,N_ELEMENTS(PATHS)-1 DO DIRECTORIES =  $                        [DIRECTORIES, FIND_ALL_DIR(PATHS[I],    $                                PLUS_REQUIRED=PLUS_REQUIRED)]                GOTO, TEST_FORMAT        ENDIF;;  Test to see if the first character is a plus sign.  If it is, then remove;  it.  If it isn't, and PLUS_REQUIRED is set, then remove any trailing '/';  character and skip to the end.;        DIR = PATHS[0]        IF STRMID(DIR,0,1) EQ '+' THEN BEGIN                DIR = STRMID(DIR,1,STRLEN(DIR)-1)        END ELSE IF KEYWORD_SET(PLUS_REQUIRED) THEN BEGIN                DIRECTORIES = PATH                IF STRMID(PATH,STRLEN(PATH)-1,1) EQ '/' THEN    $                        DIRECTORIES = STRMID(PATH,0,STRLEN(PATH)-1)                GOTO, TEST_FORMAT        ENDIF;;  For windows,  use the built-in EXPAND_PATH program.   However, first ;  resolve any environment variables.;        IF !VERSION.OS_FAMILY EQ 'Windows' THEN BEGIN                WHILE STRMID(DIR,0,1) EQ '$' DO BEGIN                    FSLASH = STRPOS(DIR,'/')                    IF FSLASH LT 1 THEN FSLASH = STRLEN(DIR)                    BSLASH = STRPOS(DIR,'/')                    IF BSLASH LT 1 THEN BSLASH = STRLEN(DIR)                    SLASH = FSLASH < BSLASH                    TEST = STRMID(DIR,1,SLASH-1)                    DIR = GETENV(TEST) + STRMID(DIR,SLASH,STRLEN(DIR)-SLASH)                ENDWHILE                TEMP = DIR                TEST = STRMID(TEMP, STRLEN(TEMP)-1, 1)                IF (TEST EQ '/') OR (TEST EQ '\') THEN  $                      TEMP = STRMID(TEMP,0,STRLEN(TEMP)-1)                DIRECTORIES = EXPAND_PATH('+' + TEMP, /ALL, /ARRAY);;  On Unix machines spawn the Bourne shell command 'find'.  First, if the;  directory name starts with a dollar sign, then try to interpret the;  following environment variable.  If the result is the null string, then;  signal an error.;        END ELSE BEGIN                IF STRMID(DIR,0,1) EQ '$' THEN BEGIN                    SLASH = STRPOS(DIR,'/')                    IF SLASH LT 0 THEN SLASH = STRLEN(DIR)                    EVAR = GETENV(STRMID(DIR,1,SLASH-1))                    IF SLASH EQ STRLEN(DIR) THEN DIR = EVAR ELSE        $                            DIR = EVAR + STRMID(DIR,SLASH,STRLEN(DIR)-SLASH)                ENDIF;               IF IS_DIR(DIR) NE 1 THEN MESSAGE,       $;                       'A valid directory must be passed'                IF STRMID(DIR,STRLEN(DIR)-1,1) NE '/' THEN DIR = DIR + '/'                SPAWN,'find ' + DIR + ' -follow -type d -print | sort -', $                        DIRECTORIES, /SH;;  Remove any trailing slash character from the first directory.;                TEMP = DIRECTORIES[0]                IF STRMID(TEMP,STRLEN(TEMP)-1,1) EQ '/' THEN    $                        DIRECTORIES[0] = STRMID(TEMP,0,STRLEN(TEMP)-1)        ENDELSE;;  Reformat the string array into a single string, with the correct separator.;  If the PATH_FORMAT keyword was set, then this string will be used.  Also use;  it when the RESET keyword was passed.;TEST_FORMAT:        DIR = DIRECTORIES[0]        CASE !VERSION.OS_FAMILY OF                'Windows':  SEP = ';'                'MacOS': Sep = ','                ELSE:  SEP = ':'        ENDCASE        FOR I = 1,N_ELEMENTS(DIRECTORIES)-1 DO DIR = DIR + SEP + DIRECTORIES[I];;  If the RESET keyword is set, and the PATH variable contains a *single*;  environment variable, then call SETENV to redefine the environment variable.;  If the string starts with a $, then try it both with and without the $.;        IF KEYWORD_SET(RESET) THEN BEGIN                EVAR = PATH                TEST = GETENV(EVAR)                IF TEST EQ '' THEN IF STRMID(EVAR,0,1) EQ '$' THEN BEGIN                        EVAR = STRMID(EVAR,1,STRLEN(EVAR)-1)                        TEST = GETENV(EVAR)                ENDIF                IF (TEST NE '') AND (TEST NE PATH) AND (DIR NE PATH) THEN $                        SETENV, STRTRIM(EVAR,2) + '=' + $			STRTRIM(STRJOIN(DIR,':'),2)        ENDIF;;-- restore current directory        cd,current        IF KEYWORD_SET(PATH_FORMAT) THEN RETURN, DIR ELSE RETURN, DIRECTORIES;        END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -