2

首先大家好,

我的问题是,我的程序创建了一个文件,该文件由另一个程序读取,之后我的程序应该删除该文件。

我使用下面的代码来检查文件是否存在以及是否有其他程序使用该文件。之后我想删除文件:

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'\n\n", filePath);
                return FALSE;
            }
        }
    }

    return (_fileExists==TRUE && _fileBussy==FALSE) ? TRUE : FALSE;
}
4

2 回答 2

4

这似乎是有问题的行(鉴于这是来自的片段int main(int argc, char **argv)

char *filePath = (char*) argv[0];

在这里,您将程序可执行文件分配给 filePath,但不是程序的第一个参数。第一个参数是 in argv[1],但你必须先检查一下argc >= 2

当您尝试通过静态路径条目删除文件时,您必须\使用第二个转义字符串中的 - 符号\

remove("C:\\test\\foo.txt");
于 2017-01-03T12:07:14.127 回答
3

你说它适用于其他文件。这些对你有用的路径是什么样的?您的整个问题可能是您没有\正确使用反斜杠。

在 C 中,\t 表示制表符。所以你写了C:<TAB>test。要在 C 中实际表达反斜杠字符\,请编写\\. (这种在各种字符前加上反斜杠来表示特殊代码的业务称为“转义”。)

例如,而不是remove("C:\test\foo.txt");你会写 remove("C:\\test\\foo.txt");

这也应该有效:remove("c:/test/foo.txt");因为 Windows 也可以接受路径中的正斜杠/而不是反斜杠\

还有Rudi对 argv 的评价。

于 2017-01-03T12:05:08.417 回答