2011-11-06 40 views
2

我需要在目錄中找到最新創建/修改的文件。基本上什麼ls -t *.bla做。在C,不是PHP的,所以這個問題並不能幫助我 - glob() - sort by date在C/linux中排序的glob


這是什麼都沒做榜樣(派生進程並不便宜,它的懶惰):

char filename[100]; 
FILE *f = popen("ls -1t /*.blabla"); 
fscanf(f, "%s", filename); 
pclose(f); 

回答

2

打開使用opendir(),讀取文件名(readdir())到一個數組中的目錄,然後做一個qsort()數組使用stat()其回調在創建或修改日期看,你再依次用告訴qsort()如何排序。不要忘記使用closedir()來關閉目錄(這可能會在下面larsmans的評論中提出的修改後變得更加高效)。

最後在排序完成後,取第一個/最後一個數組條目(取決於你的排序方式)並完成。

如果可以的話,你也可以使用scandir()來同時完成所有這些工作(儘管你不需要做更多的stat()調用,因爲那些需要在這個解決方案的qsort比較回調中完成)。

PS:有沒有人有一個想法如何做到這一點原子?

+3

由於所有'stat'調用,這也很昂貴。更好地設置一個'struct stat'/filename對的數組並對其進行排序。 –

+0

好點:每個文件只有*一個*'stat()'調用! – alk

+0

知道你只需要最後幾個修改過的文件(不需要對整個列表進行排序),你也可以使它更高效。不過,我們甚至不知道效率是否重要,所以這是一個很好的做法。請告訴我們qsort的定義在哪裏(我們需要什麼頭文件和庫?) –