2011-11-10 31 views
0

"C"コードでは、ディレクトリ内のすべてのファイルを一覧表示し、最も古いものを削除します。それ、どうやったら出来るの?ディレクトリ内のファイルを一覧表示してC/C++で削除します

私はそれにpopenを使うことができますか、それとも他の解決策がありますか?あなたは(再帰的に)ファイル階層ftsまたはnftwを通過する場合は、readdiropendir を使用してディレクトリをスキャンしたりすることができます

+1

Plain Cにはディレクトリの概念がないため、これを行うOSを指定する必要があります。 – caf

+0

Linux 2.6.xカーネル – Kitcha

+1

@caf:実際にはC言語(プログラミング言語そのものを暗示していると思われる)は、ファイルやそれ以外のものの概念さえも持っていません。 Cは約32のキーワードと少数の演算子で構成され、それはそれです。これらのファイル、ディレクトリなどの概念はすべてライブラリで定義されています。ですから、もしあなたが言語定義そのものを意味するわけではないなら、問題は標準Cライブラリで定義されたディレクトリですか?その答えはYESです。特にdirent.hのOSのディレクトリ概念は、X.OpenとPOSIX.1の両方の標準です。 –

答えて

3

タグからは、これをPOSIX準拠のシステムで行うと仮定します。 stat(男性2 STAT)を使用し、ファイルの作成または変更時刻を確認するには

#include <dirent.h> 
#include <sys/types.h> 
#include <stdio.h> 

DIR* dp; 
struct dirent* ep; 
char* path = "/home/mydir"; 

dp = opendir(path); 
if (dp != NULL) 
{ 
    printf("Dir content:\n"); 
    while(ep = readdir(dp)) 
    { 
    printf("%s\n", ep->d_name); 
    } 
} 
closedir(dp); 

:この場合、フォルダ内のファイルを一覧表示のためのコードスニペットは次のようになります。ファイルを削除するには、関数を使用するだけです。remove(const char* path)

+0

(スキャンされているディレクトリがスキャン中に更新されるため)開いているディレクトリのファイルを削除することは確実ではありません。私の提案は、2つのパスでそれを行うことです:最初のスキャンであり、削除するファイルを見つける、2番目はそれらを削除しています。 –

+0

これは非常に良い発言です。しかし、この場合は、OPが最も古いファイルを削除したいので、削除する前にスキャンを終了する必要があります(最も古いファイルを見つけるにはすべてのファイルをチェックする必要があります)。 – Patryk

1

おかげで、。現在のディレクトリ"."と親ディレクトリ".."のエントリを無視することを忘れないでください。おそらくstatのシステムコールも使用したいと思うでしょう。

+0

ありがとうございます。私はそれを試してみましょう。 – Kitcha

+0

'readdir()'を 'opendir()'なしで使用することはできません - もう一方は他のものに許されません。 – Dave

+0

ありがとう、私はそれをreaddirとopendirにするように編集しました –

2

Linux(と実際にはどのPOSIXシステム)でも、opendir()/readdir()/closedir()を呼び出してディレクトリを読み取ります。次に、各ディレクトリエントリに対してstat()を呼び出して、ファイルであるかどうか、およびそのアクセス/変更/ステータス変更時刻は何かを判断できます。

「最も古い」の定義がの作成時刻に依存する場合、ファイルの時刻はです。これは不安定です。伝統的にUNIXでは作成時間が記録されませんでした。 Linuxでは、最新のファイルシステムの中には拡張属性file.crtimegetxattr()からsys/xattr.hにアクセス)がありますが、その属性が存在しない一般的なケースを処理する必要があります。

関連する問題