C++ 仅使用C/C+;写入期间的iOS文件大小+;原料药

C++ 仅使用C/C+;写入期间的iOS文件大小+;原料药,c++,ios,file,C++,Ios,File,目的:我正在使用BSD内核队列监视iOS上特定目录中的文件写入,并轮询文件大小以确定写入结束(当大小停止更改时)。其基本思想是仅在iTunes sync提供任意数量的文件副本后刷新文件夹。我有一个完全工作的ObjuleC实现,但是我有理由需要在C++中实现同样的事情。 问题:阻止我的是,在写过程中,找不到C或C++ API将获得正确的文件大小。想必,其中一个必须存在,因为Objective-C的[NSFileManager AttributesFiteMatPath:]似乎可以工作,我们都知道

目的:我正在使用BSD内核队列监视iOS上特定目录中的文件写入,并轮询文件大小以确定写入结束(当大小停止更改时)。其基本思想是仅在iTunes sync提供任意数量的文件副本后刷新文件夹。我有一个完全工作的ObjuleC实现,但是我有理由需要在C++中实现同样的事情。

<强>问题:阻止我的是,在写过程中,找不到C或C++ API将获得正确的文件大小。想必,其中一个必须存在,因为Objective-C的[NSFileManager AttributesFiteMatPath:]似乎可以工作,我们都知道它只是在下面调用一个C API

失败的解决方案:

  • 我曾尝试使用stat()和lstat()获取st_大小,甚至是分配的块计数的st_块,它们为目录中的大多数文件返回正确的大小,但当发生文件写入时,文件的大小在轮询间隔之间不会改变,并且在该目录中迭代的每个后续文件的大小都不正确

  • 我尝试过使用fseek和ftell,但它们也导致了一个非常类似的问题

  • 我还尝试使用stat()和st_mtimespec修改日期而不是大小,并且日期在写入过程中似乎没有变化——这不是我所期望的

  • 回到NSFileManager为我提供正确值的能力,有人知道[NSFileManager AttributesFiteMatPath:]下面实际使用的是什么C API调用吗

    提前谢谢

    更新: 这似乎与正在进行的写入操作关系不大,而与特定文件关系更大。仔细检查后,有些文件总是返回大小,而有些文件在使用C API时从不返回大小(但在使用Objective-C API时可以正常工作)。即使创建一个“好”文件的副本,C API也不想给出副本的大小,但可以很好地处理原始的“好”文件。对于文本(xml)文件和二进制(zip)文件,我既有失败也有成功。我正在使用iTunes将这些文件添加到iPad应用程序的文档目录中。这是一款iPad迷你视网膜

    更新2-回答:
    如果您的路径没有像我的路径那样被无形地破坏,那么上述任何一种文件大小方法都可能有效。请参阅关于路径为何被破坏的公认答案。

    这个奇怪的行为原来是路径的问题,导致字符串可以正常打印,但很可能在内存中被破坏,以至于文件描述符有时不喜欢它(因此只发生在某些文件路径中)。我使用direntapi迭代目录中的文件,并错误地连接dir路径和文件名

    错误的路径连接:显然(或者在运行时不那么明显)三次复制str不会有好的结果

    char* fullPath = (char*)malloc(strlen(dir) + strlen(file) + 2);
    strcpy(fullPath, dir);
    strcpy(fullPath, "/");
    strcpy(fullPath, file);
    long sizeBytes = getSize(fullPath);
    free(fullPath);
    
    正确的路径连接:使用正确的str连接

    char* fullPath = (char*)malloc(strlen(dir) + strlen(file) + 2);
    strcpy(fullPath, dir);
    strcat(fullPath, "/");
    strcat(fullPath, file);
    long sizeBytes = getSize(fullPath);
    free(fullPath);
    
    长话短说,这是我草率的工作,通过两个打字错误