掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.24807

指定したディレクトリとそれ以下にあるディレクトリとファイルの削除方法
投稿者---なおと(2005/12/14 19:29:25)


初めまして。なおとと申します。どうしても分からないプログラムがあり、教えてほしいので投稿させて頂きました。

題名のプログラムで、opendir関数やreaddir関数を使って再起的にディレクトリに移動し、remove関数でファイルを消しながら空のディレクトリをrmdir関数で消去する、というおおまかな流れは分かるのですがどうしてもうまくいきません。マニュアルを見ながらでもよく分かりません。どなたか具体例を示して頂けないでしょうか?

OSはLINUX、コンパイラ処理系はCです。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:指定したディレクトリとそれ以下にあるディレクトリとファイルの削除方法 24808 nop 2005/12/14 19:53:47


No.24808

Re:指定したディレクトリとそれ以下にあるディレクトリとファイルの削除方法
投稿者---nop(2005/12/14 19:53:47)


>どうしてもうまくいきません。

何を行ったら、どの様な結果になったのですか?
そこを書かなければ只の丸投げです。

【掲示板利用宣言】に沿った投稿をして下さい。
課題の丸投げはしません。
・環境(OSとコンパイラ)や症状は具体的に詳しく書きます。


この投稿にコメントする

削除パスワード

No.24829

指定したディレクトリとそれ以下にあるディレクトリとファイルの削除方法
投稿者---なおと(2005/12/15 18:39:49)


#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <unistd.h>

int main(int argc, char **argv)
{
int a, error;
char buffer[512];
struct dirent *p;
struct stat sbuf;
DIR *dp;

dp = opendir(".");
p = readdir(dp);
a = p->d_ino;
dp = opendir(argv[1]);
chdir(argv[1]);
if(dp==NULL) return 0;
while(1){
p = readdir(dp);
if(stat(p->d_name, &sbuf) == -1) return 0;
switch(sbuf.st_mode & S_IFMT){
case S_IFDIR: chdir(p->d_name);
getcwd(buffer, 512);
printf("%s\n",buffer);
dp = opendir(".");break;
case S_IFREG: remove(p->d_name);break;
}
if(p==0){
chdir("..");
dp = opendir(".");
p = readdir(dp);
stat(p->d_name, &sbuf);
if(p->d_ino == a) break;
rmdir(p->d_name);
}
}
closedir(dp);
return 0;
}

このようにプログラムして試みたのですが、コマンドラインで指定したディレクトリまでの絶対パス名が繰り返し出力され、最後に「セグメンテーション違反です」と出力されます。

コンパイルをして実行するディレクトリのiノード番号をプログラムの最初で保存し、カレントディレクトリを元の場所に戻す時にそのiノード番号と一致したら(つまりコンパイルして実行したディレクトリに戻ったら)while文を抜けて終了させよう、というアイデアでやりました。


この投稿にコメントする

削除パスワード

No.24831

Re:指定したディレクトリとそれ以下にあるディレクトリとファイルの削除方法
投稿者---RAPT(2005/12/15 19:12:31)


とりあえず、字下げとCSrcConvとぶら下がり文の除去を行ないました。

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <unistd.h>

int main(int argc, char **argv)
{
    int a, error;
    char buffer[512] = {0};
    struct dirent *p = NULL;
    struct stat sbuf = {0};
    DIR *dp = NULL;

    dp = opendir(".");
    p = readdir(dp);
    a = p->d_ino;
    dp = opendir(argv[1]);
    chdir(argv[1]);
    if(dp == NULL){
        return 0;
    }
    while(1){
        p = readdir(dp);
        if(stat(p->d_name, &sbuf) == -1){
            return 0; // closeしていないので、return しちゃだめだと思う。ここは break; とすべき。
        }
        switch(sbuf.st_mode & S_IFMT){
        case S_IFDIR:
            chdir(p->d_name);
            getcwd(buffer, 512);
            printf("%s\n", buffer);
            dp = opendir(".");
            break;

        case S_IFREG:
            remove(p->d_name);
            break;
        }
        if(p == 0){
            chdir("..");
            dp = opendir(".");
            p = readdir(dp);
            stat(p->d_name, &sbuf);
            if(p->d_ino == a){
                break;
            }
            rmdir(p->d_name);
        }
    }
    closedir(dp); // この非標準関数は知らないけど、閉じるのは最後だけで良いの?
    // 普通に考えると、ディレクトリを削除する前にcloseすべきだと思うのだけど。
    return 0;
}



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧