首先大家好,
我的问题是,我的程序创建了一个文件,该文件由另一个程序读取,之后我的程序应该删除该文件。
我使用以下代码来检查该文件是否存在以及是否有任何其他程序使用该文件。之后我想删除文件:
if(isFileRdy("C:\test\foo.txt"))remove("C:\test\foo.txt");
有没有人知道,问题可能在哪里。有趣的是,这适用于其他文件。并且foo.txt
也是由该程序创建的,没有特殊访问权限。
谢谢:)
/* just suppose the things with argc and argv work, I know it's uggly
but I need it as a call back function later in the code */
BOOL isFileRdy(char *filePath)
{
int argc = 1;
void *argv[1];
argv[0]= (void*) filePath;
return isFileRdyCBF(argv, argc);
}
BOOL isFileRdyCBF(void *argv[], int argc)
{
/* I used */
char *filePath = (char*) argv[0];
FILE *fDes = NULL;
BOOL _fileExists = FALSE;
BOOL _fileBussy = TRUE;
_fileExists = fileExists(filePath);
if(_fileExists)
{
fDes = fopen(filePath, "a+");
if(fDes!=NULL)
{
_fileBussy = FALSE;
if(fclose(fDes)!=0)
{
printf("nERROR could not close file stream!");
printf("n '%s'nn", filePath);
return FALSE;
}
}
}
return (_fileExists==TRUE && _fileBussy==FALSE) ? TRUE : FALSE;
}
似乎是有问题的行(鉴于这是int main(int argc, char **argv)
的一个片段:
char *filePath = (char*) argv[0];
在这里,您将程序可执行文件分配给 filePath,而不是将第一个参数分配给程序。第一个参数在 argv[1]
中,但您必须先检查该argc >= 2
。
当您尝试通过静态路径条目删除文件时,必须使用第二个转义字符串中的
符号:
remove("C:\test\foo.txt");
你说它适用于其他文件。这些适合您的路径是什么样的?您的整个问题可能是您没有正确使用反斜杠。
在 C 中,t
表示制表符。所以你写了C:<TAB>test
.要实际表达 C 中的反斜杠字符,您需要编写
\
.(这种在各种字符之前放置反斜杠以表示特殊代码的业务称为"转义"。
例如,与其写remove("C:testfoo.txt");
不如写remove("C:\test\foo.txt");
这也应该有效:remove("c:/test/foo.txt");
因为Windows也可以接受正斜杠/
而不是路径中的反斜杠。
还有鲁迪对argv的评价。