Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
删除C语言中的文件_C - Fatal编程技术网

删除C语言中的文件

删除C语言中的文件,c,C,我写了一个程序来处理文件,有时我会删除一个文件。因此,我在C中的stdio头文件中搜索并找到了remove()函数 问题是有时有效,有时无效。有时文件会被删除,other perror()会显示一条消息,表示权限被拒绝,但我没有对该文件指定任何特殊权限。事实上,该文件是不久前由另一个函数创建的。有什么特殊的条件需要考虑吗?< 以下是创建文件的加载函数: ... int loadF ( const char *filename, plist_t pl, int size, int createFl

我写了一个程序来处理文件,有时我会删除一个文件。因此,我在C中的stdio头文件中搜索并找到了remove()函数

问题是有时有效,有时无效。有时文件会被删除,other perror()会显示一条消息,表示权限被拒绝,但我没有对该文件指定任何特殊权限。事实上,该文件是不久前由另一个函数创建的。有什么特殊的条件需要考虑吗?< 以下是创建文件的加载函数:

...
int loadF ( const char *filename, plist_t pl, int size, int createFlag ) {
    FILE *pFile = NULL;
    pnode_t pn = NULL;
    int fsize;
    int total;
    int i;

    // Get file stream.
    pFile = fopen ( filename, "rb" );
    if ( !pFile ) { // File does not exist.
        if ( createFlag ) {
            if ( !createF ( filename ) ) {
                return 0;   // fail
            }
        } else {    // abort
            perror ( "loadF:fopen" );
            return 0;
        }
    }

    // Confirm that we have opened the file stream.
    if ( !pFile ) {
        pFile = fopen ( filename, "rb" );
        if ( !pFile ) {
            perror ( "loadF:fopen:" );
            return 0;
        }
    }

    // Check if list has not been initialized.
    if ( pl == NULL ) {
        fclose ( pFile );
        pFile = NULL;
        return 0;   // abort
    }

    // Get the size of the file.
    fseek ( pFile, 0, SEEK_END );
    fsize = ftell ( pFile );
    rewind ( pFile );

    // Check if the file is empty.
    if ( !fsize ) {
        fclose ( pFile );
        pFile = NULL;
        return 1;   // No data to load, continue.
    }

    // Get the total number of structures in the file.
    total = fsize / size;

    // Allocate memory for a node to transfer data.
    pn = (pnode_t) malloc ( sizeof (node_t) * sizeof (char) );
    if ( !pn ) {
        fclose ( pFile );
        pFile = NULL;
        perror ( "loadF:malloc" );
        return 0;
    }

    // Copy from file to list every structure.
    for ( i = 1; i <= total; i++ ) {
        if ( feof ( pFile ) ) {
            printf ( "OUT!" );
            break;
        }
        printf ( "g" );
        fread ( pn->key, size, 1, pFile );
        printf ( "f\n" );
        if ( ferror ( pFile ) ) {
            fclose ( pFile );
            pFile = NULL;
            perror ( "loadF:fread" );
            return 0;
        }
        addfirst ( pl, pn->key ); // Maybe we have to allocate memory with malloc every time?
        // Debug with a for loop in the nodes of the list to see if data are OK.
        printf ( "cid = %d\n", pl->head->key->card.cid );
        printf ( "limit = %5.2f\n", pl->head->key->card.limit );
        printf ( "balance = %5.2f\n", pl->head->key->card.balance );
    }

    // Close the stream.
    if ( pFile ) {
        fclose ( pFile );
        pFile = NULL;
    }

    // Deallocate transfer memory.
    if ( pn ) {
        free ( pn );
    }

    // Exit
    return 1;
}

我使用的是Windows XP。

您尚未指定正在使用的平台,但在Windows上,当您尝试删除该文件时,该文件不应打开。(在Unix风格的系统上,情况有点不同,即使文件打开,删除几乎总是可能的。)

我认为有三个原因:

  • 您没有删除该文件的权限
  • 另一个函数正在使用该文件
  • 您必须在该文件所在的目录中具有写入权限

  • 无法删除文件的情况也可能取决于文件被另一个进程锁定。在您的情况下,创建文件可能是您的函数。这还取决于您使用的平台。如果是Windows,请尝试使用Unlocker,然后重试删除文件。

    我是否理解您的意思: 在第5行创建一个文件,然后在第7行删除它

    如果是: 尝试在这些行之间设置一个小的停顿,100应该可以。
    或者:文件仍处于打开状态。关闭它,然后尝试删除它。

    如何在c中延迟?是否有delay()函数?修复了此问题,函数有时会打开指向文件的pfile指针。谢谢你的回答。欢迎来到堆栈溢出!当您收到问题的好答案时,请单击答案左侧的复选框大纲“接受”最有用的答案。这表示您收到了一个对您有用的答案。这样做有助于提高您在网站上的声誉。
    int saveF ( const char *filename, plist_t pl, int size ) {
        FILE *pFile = NULL;     // Pointer to the file structure.
        pnode_t pn = NULL;      // Pointer to a node of a list.
    
    
        // Delete the specified file - on success it returns 0.
        if ( remove (filename) == -1 ) {
            perror ( "saveF:remove" );
            return 0;
        }
    
        // Re-create the file (but now is empty).
        if ( !createF (filename) ) {
            return 0;
        }
    
        // Get the file stream.
        pFile = fopen ( filename, "ab" );
        if ( !pFile ) {
            perror ( "saveF:fopen" );
            return 0;
        }
    
        // Check if list is not empty.
        if ( isEmpty ( pl ) ) {
            fclose ( pFile );
            pFile = NULL;
            return 0;           // Abort
        }
    
        // Traverse the list nodes and save the entity that the key points to.
        for ( pn = pl->head; pn != NULL; pn = pn->next ) {
            fwrite ( (pccms_t)(pn->key), size, 1, pFile );
            if ( ferror ( pFile ) ) {
                fclose ( pFile );
                pFile = NULL;
                perror ( "saveF:fwrite" );
                return 0;
            }
        }
    
        // Close the stream.
        if ( pFile ) {
            fclose ( pFile );
            pFile = NULL;
        }
    
        // Exit
        return 1;
    }