ページ 11

remove関数でファイルが削除できない

Posted: 2010年7月09日(金) 19:14
by dic
最近は質問が多いですが
下のソースで実行しているのですが、
不要になったファイルを削除する処理です
int i;
を中心にファイル名を作成してremove()関数で削除しているのですが
なぜかファイルが削除されていません
読み取り専用などの属性はついていないのでサービスパックもあてましたが
やはり削除されませんでした
何が原因なのでしょうか?
//=========================================
//    不要ファイルの削除
void    function300()
{
    int    i;
    char    file[1024];
    for( i=DEF_START; i<DEF_END; i++ )
    {
        char    mes[80];
        memset( mes, 0, sizeof(mes) );
        sprintf( mes, "不要ファイルの削除 %d/%d", i+1, DEF_END );
        printf( mes );

        memset( file, 0, sizeof(file) );
        sprintf( file, "%d.txt", i );
        remove( file );

        memset( file, 0, sizeof(file) );
        sprintf( file, "%d_jis.txt", i );
        remove( file );

        memset( file, 0, sizeof(file) );
        sprintf( file, "%d_list.txt", i );
        remove( file );

        int    len;
        for( len=0; len<strlen(mes); len++ )
            putchar( 0x08 );
    }
    remove( DEF_LIST );
    remove( "list.txt" );
    printf( "\n" );
}
環境は WindowsXP
Visual C++ 6.0 SP 6
です

Re:remove関数でファイルが削除できない

Posted: 2010年7月09日(金) 19:29
by Poco
remove()実行後のerrnoの値は何になっていますか?

Re:remove関数でファイルが削除できない

Posted: 2010年7月10日(土) 09:56
by dic
>remove()実行後のerrnoの値は何になっていますか?
下のようにデバック出力するようにしました
//=========================================
//    不要ファイルの削除
void    function300()
{
    printf( "STEP5 / %d\n", DEF_STEP );

    FILE    *f = fopen( "debug.txt", "wt" );

    char    debug[80];
    sprintf( debug, "EACCES :%d  ENOENT :%d\n", EACCES, ENOENT );
    fputs( debug, f );

    int    i;
    char    file[1024];
    for( i=DEF_START; i<DEF_END; i++ )
    {
        char    mes[80];
        memset( mes, 0, sizeof(mes) );
        sprintf( mes, "不要ファイルの削除 %d/%d", i+1, DEF_END );
        printf( mes );

        int    r;
        char    log[80];
        memset( file, 0, sizeof(file) );
        sprintf( file, "%d.txt", i );
        r = remove( file );
        sprintf( log, "%d - %s\n", errno, file );
        fputs( log, f );

        memset( file, 0, sizeof(file) );
        sprintf( file, "%d_jis.txt", i );
        r = remove( file );
        sprintf( log, "%d - %s\n", errno, file );
        fputs( log, f );

        memset( file, 0, sizeof(file) );
        sprintf( file, "%d_list.txt", i );
        r = remove( file );
        sprintf( log, "%d - %s\n", errno, file );
        fputs( log, f );

        int    len;
        for( len=0; len<strlen(mes); len++ )
            putchar( 0x08 );
    }
    remove( DEF_LIST );
    remove( "list.txt" );
    printf( "\n" );
    fclose( f );
}
しかしerrnoの値では成功をあらわしているのですが
削除されるファイルと削除されないファイルがでます

--------------- debug.txt -------------------
EACCES :13  ENOENT :2
13 - 483.txt
13 - 483_jis.txt
13 - 483_list.txt
13 - 484.txt
13 - 484_jis.txt
13 - 484_list.txt
13 - 485.txt
13 - 485_jis.txt
13 - 485_list.txt
13 - 486.txt
13 - 486_jis.txt
13 - 486_list.txt
13 - 487.txt
13 - 487_jis.txt
13 - 487_list.txt
13 - 488.txt
13 - 488_jis.txt
13 - 488_list.txt
13 - 489.txt
13 - 489_jis.txt
13 - 489_list.txt

Re:remove関数でファイルが削除できない

Posted: 2010年7月10日(土) 10:03
by へろりくしょん
まったく的はずれだったらごめんなさい。

マイコンピュータと出てるので、お使いの環境はWindowsだと思いますが、
そのフォルダでF5でも押して更新したら、実は消されていたなんて事はありませんか?


ごめんなさい追記です。

>しかしerrnoの値では成功をあらわしているのですが削除されるファイルと削除されないファイルがでます

の1文しかまともに見てませんでした。

消せないファイルの時は、erno はエラーコードを保持していたのですね。
失礼しました。 画像

Re:remove関数でファイルが削除できない

Posted: 2010年7月10日(土) 10:51
by dic
F5押しましたがやっぱり現象は変わらないようです

今度はremoveの戻り値をチェックしてみたら
remove関数が-1を返していました(失敗)
sprintf( log, "%d - %2d %s\n", errno, r, file );

13 - 0 121_jis.txt
13 - -1 121_list.txt
13 - 0 122.txt
...
13 - 0 125_jis.txt
13 - -1 125_list.txt
13 - 0 126.txt
...
13 - 0 152_jis.txt
13 - -1 152_list.txt
13 - 0 153.txt
...
13 - 0 164_jis.txt
13 - -1 164_list.txt
13 - 0 165.txt

これはどう対応したらいいでしょうか?

function10 -> function 20 -> ... function300 だと失敗し
function300だけだと成功するんです
画像

Re:remove関数でファイルが削除できない

Posted: 2010年7月10日(土) 11:23
by toyo
1つの可能性
fopenしたままでfcloseしないままremoveしている

Re:remove関数でファイルが削除できない

Posted: 2010年7月10日(土) 11:44
by mila
GetLastError関数を使えばもう少し詳細な情報を取得できます。
確認してみてください。

Re:remove関数でファイルが削除できない

Posted: 2010年7月10日(土) 11:50
by toyo
http://msdn.microsoft.com/ja-jp/library ... 80%29.aspx
EACCES は、読み取り専用ファイルのパスが指定されているか、指定したファイルが開いていることを示します。

読み取り専用でなければファイルが開いたままだろうということで

Re:remove関数でファイルが削除できない

Posted: 2010年7月10日(土) 13:48
by dic
>fopenしたままでfcloseしないままremoveしている
他のは削除されてるのでその可能性は少ないかと

>GetLastError関数を使えばもう少し詳細な情報を取得できます。
こちらで確認します

時間かかるんで返答おそくなります

Re:remove関数でファイルが削除できない

Posted: 2010年7月10日(土) 14:56
by dic
GetLastError()の戻り値は 32 でした
エラーコードの内容は
プロセスはファイルにアクセスできません。別のプロセスが使用中です。
というものだったんですが

書いてる途中で確認したら
fcloseしてなかったです

とある事情で機能の一部を制限しないといけなかったんで
そこのところの処理の流れでfcloseをしてなかったです・・・orz
したのような制限を入れないといけなくなったので
てっきり全部fcloseされてるものと思ってました
//=========================================
void    function211()
{
    printf( "STEP4 / %d\n", DEF_STEP );

    int    i;
    char    list[1024];

    for( i=DEF_START; i<DEF_END; i++ )
    {
        memset( list, 0, sizeof(list) );
        sprintf( list, "%d_list.txt", i );
        FILE    *file = fopen( list, "rt" );

        int    size = GetFileLen( list );

        char    dir[1024];
        char    filename[1024];

        //    1行目はディレクトリ名
        memset( dir, 0, sizeof(dir) );
        fgets( dir, sizeof(dir), file );
        dir[ strlen(dir)-1 ] = 0;

        //    機能制限
        if( strstr(dir,"ほげほげ") )    continue;
        CreateDirectory( dir, NULL );

        int    j = 0;
        while( !feof(file) )
        {
            char    mes[80];
...
            for( len=0; len<strlen(mes); len++ )
                putchar( 0x08 );
        }

        fclose( file );
    }
}
toyoさん milaさん へろりさん ぽこさん
回答ありがとうございました
解決できました