2017-05-25 44 views
0

所以,基本上,我有一個程序,該程序會刪除子進程並使用名稱+子進程ID創建一個目錄。這是在代碼的另一部分完成的。有沒有辦法將chdir()放入只有目錄名稱開頭已知的目錄中?

因此,可以說用戶將目錄命名爲「TestDir#」。最終將是TestDir12342或類似的東西。

因此,稍後,用戶可以輸入TestDir#來輸入該目錄的搜索詞。我想隱藏「#」,並讓chdir()搜索以該名稱「TestDir」開頭的目錄。我不必擔心重複文件或此程序的類似命名文件。

有沒有人知道一個簡單的方法來做到這一點與chdir()?我已經嘗試了許多不同的測試代碼,但是我輸了。

我也試圖在父進程中存儲子進程ID,但由於某種原因,我永遠不能讓它們匹配。我知道fork()將父進程ID返回給父進程。然而,由於某種原因,該計劃拒絕讓它們匹配。

所以,我想這是一個解決方法(搜索文件名的開頭部分)。感謝任何幫助,如果有人知道的方式來做到這一點。

+2

我想你將不得不在父目錄中的文件上使用'strncmp'手動搜索前綴匹配。 – merlin2011

+4

調試無法保留進程標識的代碼似乎很合適。我認爲這個問題的這個部分也是。它(在我看來)仍然是一個關於編碼的清晰而單一的問題。所以考慮製作一個顯示兩個部分的[mcve]。答案可能基於查找ID問題或改進您擁有的目錄名稱的嘗試。如果這個(我的評論)得到了抵觸,請提出第二個問題。 – Yunnosch

+0

在Linux中使用['glob'](https://linux.die.net/man/3/glob)查找您感興趣的路徑。 – kaylum

回答

2

readdir可用於獲取目錄的條目。

以下searchFirstDir找到第一個前綴匹配的目錄。 (在Ubuntu Linux操作系統測試)

#include <stdio.h> 
#include <unistd.h> 
#include <dirent.h> 
#include <stddef.h> 
#include <stdlib.h> 
#include <string.h> 

int searchFirstDir(const char *workingDir, const char *prefix, char *resultBuffer, int bufferLen) 
{ 
    DIR *pDir = NULL; 
    int found = 0; 
    // opendir 
    { 
     pDir = opendir(workingDir); 
     if (pDir == NULL) { 
      perror("ERROR: opendir"); 
      return -1; 
     } 
    } 

    // readdir 
    { 
     int ret; 
     struct dirent *pEntry; 
     struct dirent *result; 
     int prefixLen = strlen(prefix); 

     // refer: man readdir (in Linux) 
     { 
      long name_max = pathconf(workingDir, _PC_NAME_MAX); 
      if (name_max == -1)   /* Limit not defined, or error */ 
       name_max = 255;   /* Take a guess */ 
      size_t len = offsetof(struct dirent, d_name) + name_max + 1; 
      pEntry = malloc(len); 
     } 

     do { 
      ret = readdir_r(pDir, pEntry, &result); 
      if (ret) { 
       perror("ERROR: readdir_r"); 
       break; 
      } 

      if (pEntry->d_type == DT_DIR && strncmp(pEntry->d_name, prefix, prefixLen) == 0) { 
       strncpy(resultBuffer, pEntry->d_name, bufferLen); 
       found++; 
       break; 
      } 
     } while(ret == 0 && result != NULL); 

     free(pEntry); 
    } 

    // closedir 
    closedir(pDir); 

    return found > 0 ? 0 : -1; 
} 

int main(int argc, char *argv) 
{ 
    char resultBuffer[255]; 

    int ret = searchFirstDir("workingdirectory", "TestDir", resultBuffer, 255); 
    if (ret == 0) { 
     printf("First matched directory: %s\n", resultBuffer); 
    } 
} 
+0

小心,'strncpy'並不總是終止目標字符串。 –

1

是的,有執行CHDIR採取使用的「*」通配符匹配,一種即文件名擴展的優點所請求的類型的方式,如下所示:

#include <string.h> 
#include <glob.h> 
#include <unistd.h> 
#include <stdio.h> 
#include <stdlib.h> 


/* Convert a wildcard pattern into a list of blank-separated 
    filenames which match the wildcard. */ 

char * glob_pattern(char *wildcard) 
{ 
    char *gfilename; 
    size_t cnt, length; 
    glob_t glob_results; 
    char **p; 

    glob(wildcard, GLOB_NOCHECK, 0, &glob_results); 

    /* How much space do we need? */ 
    for (p = glob_results.gl_pathv, cnt = glob_results.gl_pathc; 
     cnt; p++, cnt--) 
    length += strlen(*p) + 1; 

    /* Allocate the space and generate the list. */ 
    gfilename = (char *) calloc(length, sizeof(char)); 
    for (p = glob_results.gl_pathv, cnt = glob_results.gl_pathc; 
     cnt; p++, cnt--) 
    { 
     strcat(gfilename, *p); 
     if (cnt > 1) 
     strcat(gfilename, " "); 
    } 

    globfree(&glob_results); 
    return gfilename; 
} 

int main() { 
    char *directory; 
    int ret; 


    directory = glob_pattern("te*"); 

    ret = chdir (directory); 
    printf("Result of chdir: %d\n",ret); 
} 

注:代碼的「通配」一部分來自here

Linux有水珠工具,所以如果你希望做在C中一樣,你必須自己編寫的代碼,因爲這例子描繪。當程序結束時,您將回到最初用來運行此腳本的目錄中。當代碼執行成功的目錄更改時,返回結果爲零。請注意,此代碼在包含名爲「test」的子目錄的目錄中執行。

相關問題