2012-06-18 35 views
0

從當前路徑遍歷並搜索文件時,我在查找文件時遇到問題。相對路徑/絕對路徑查詢不適用於當前目錄

我懷疑的是,path是,由於chdir怪,在下面的代碼:

相關的文件夾爲:

  • 12,13,14,12是父親目錄
  • 13的內部12,14的內部13
  • david1.txt內部14
  • get_current_dir_name()是Linux的功能,而不是我

我跑從Desktop可執行文件,像這樣的(這裏是printf-s對於試圖定位問題):

// doesn't work 

    [email protected]:~/Desktop$ ./exer4 12 david1.txt 

    Current path is :12 

    Current path is :/home/a/Desktop/12/13 

    Current path is :/home/a/Desktop/12/13/14 

////////////////////////////////////////////////// 
    // doesn't work  

    [email protected]:~/Desktop$ ./exer4 12/13 david1.txt 

    Current path is :12/13 

    Current path is :/home/a/Desktop/12/13/14 

//////////////////////////////////////////////// 
    // doesn't work 

    [email protected]:~/Desktop$ ./exer4 12/13/14 david1.txt 

    Current path is :12/13/14 

如果我刪除這些行:

chdir(path);       // the problem is probably here 
strcpy(path, get_current_dir_name()); // and here 

然後每次只涉及單個庫名稱查詢 - 作品,例如:

// works : 

[email protected]:~/Desktop$ ./exer4 12 david1.txt 

Current path is :12 

Current path is :12/13 

File found! 

12/13/14/david1.txt-rw-rw-r-- 1 1000 1000 0 2012-06-17 08:10 

Current path is :12/13/14 
//////////////////////////////////////////////////////////// 
// works 
[email protected]:~/Desktop$ ./exer4 12/13 david1.txt 

Current path is :12/13 

File found! 

12/13/14/david1.txt-rw-rw-r-- 1 1000 1000 0 2012-06-17 08:10 

Current path is :12/13/14 

//////////////////////////////////////////////////////////// 
// Doesn't work 
[email protected]:~/Desktop$ ./exer4 12/13/14 david1.txt 

Current path is :12/13/14 

任何想法我在做什麼錯在這裏?我試圖改變無數次,但沒有解決它。謝謝

+0

如果您認爲存在問題,爲什麼不檢查返回碼。 – pizza

+0

顯示其餘的代碼,否則很難說。 – rumpel

+0

如何檢查文件是否存在於目錄中?向我們顯示一些代碼以找到錯誤 – MYMNeo

回答

2

在做strcpy(path, get_current_dir_name())時,你不檢查是否超過緩衝區。
如果pathargv[1],則表示您超出堆棧。
我的猜測是你超出了文件名(argv[2]),然後你開始尋找錯誤的名字(並且沒有找到它)。

1

我認爲這個問題是這一行:

if (S_ISDIR(fstat.st_mode)) 

您先檢查fstat.st_mode無論是目錄,然後找到你的目標文件。如果使用功能chdir(),當目錄變爲12/13/14時,它不會使條件成爲假,displayAllFiles(full_name , filename)將不會調用 。

+0

因此,如果我將'dhdir()'的調用移動到'main'並且只調用遞歸,那麼它會這樣做嗎?我現在試着用 – ron

+0

@ron,我寫了一個類似的函數來查找導致問題的原因,我找到了原因。正如ugoren所說,你有一個堆棧重寫,第一次運行traverseDirectories時,argv [1]的大小是確定的,它的大小是argv [1]的長度,然後你運行strcpy(),它超越了argv的內容[2] – MYMNeo

+0

我現在做了一些其他的事情,從main:'\t \t char path [ 4096]; \t \t char filename [4096]; \t \t strcpy(path,argv [1]); //複製要搜索的文件夾 \t \t strcpy(filename,argv [2]); \t //複製文件以搜索' – ron

2

添加一些我的調試信息,以幫助您清楚地瞭解原因。

運行strcpy(path, get_current_dir_name());

Breakpoint 1, traverseDirectories (path=0xbfbfeda8 "src", recursive=1, filename=0xbfbfedac "2.db") at main.c:30 
    30    chdir(path); 

0xbfbfeda8:  0x73 0x72 0x63 0x00 0x32 0x2e 0x64 0x62 
0xbfbfedb0:  0x00 0x54 0x45 0x52 0x4d 0x3d 0x78 0x74 
0xbfbfedb8:  0x65 0x72 0x6d 0x00 0x53 0x48 0x45 0x4c 
0xbfbfedc0:  0x4c 0x3d 0x2f 0x75 0x73 0x72 0x2f 0x6c 

運行strcpy(path, get_current_dir_name());

0xbfbfeda8:  0x2f 0x75 0x73 0x72 0x2f 0x68 0x6f 0x6d 
0xbfbfedb0:  0x65 0x2f 0x6e 0x65 0x6f 0x2f 0x73 0x72 
0xbfbfedb8:  0x63 0x00 0x6d 0x00 0x53 0x48 0x45 0x4c 
0xbfbfedc0:  0x4c 0x3d 0x2f 0x75 0x73 0x72 0x2f 0x6c 

看到區別了之後之前呢?這就是爲什麼你的功能無法正常工作。