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