如何检测文件生成结束

风叶落 2014-03-25 07:21:34
程序A会在指定目录下生成文件,我现在需要在文件生成之后将其传输到另外一个地方。
程序A不提供接口,只能通过监控目录的方式来得知文件是否生成。
但是问题是文件产生后程序A依然会继续写文件,很多时候都是文件没写完我的程序就将其传走了
求解,如何检测文件已经生成完毕?

ps:Write方式来读文件这种方法不行,sleep方式时间不好定。
...全文
187 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
孤影品茗 2014-03-27
  • 打赏
  • 举报
回复
对A一无所知,果断还是只有HOOK,否则,根本无法判断是否写完
风叶落 2014-03-26
  • 打赏
  • 举报
回复
引用 10 楼 zhao4zhong1 的回复:
不可行就说明写文件的程序 不是fopen后一直fwrite或fprintf或fputs,期间可能fflush,全部写完最后fclose 而是每次写都重复“fopen,fwrite或fprintf或fputs,期间可能fflush,fclose”这个过程 这种情况下依我看只能如下处理了:
#include <sys/types.h>
#include <sys/stat.h>
#include <io.h>
#include <windows.h>
__int64 fl;
int n,r;
struct _stati64 st;

fl=-1i64;
n=0;
while (1) {
    r=_stati64("等待别的程序写完的文件名",&st);
    if (0==r) {
        if (fl==-1i64) {
            fl=st.st_size;
        } else {
            if (fl!=st.st_size) {
                fl=st.st_size;
                printf("别的程序没写完\n");
                n=0;
            }
        }
        n++;
        if (n>30) {
            printf("别的程序30秒都没写,当作其已经写完。\n");
            break;
        }
        Sleep(1000);
    } else {
        printf("等待别的程序写完的文件名 不存在\n");
        break;
    }
}
判断文件的大小变化么?我试试看,3Q!
赵4老师 2014-03-26
  • 打赏
  • 举报
回复
逆向A程序写文件的过程。 去看雪论坛逛逛。 或者直接Hook A程序写文件使用的API。
赵4老师 2014-03-26
  • 打赏
  • 举报
回复
不可行就说明写文件的程序 不是fopen后一直fwrite或fprintf或fputs,期间可能fflush,全部写完最后fclose 而是每次写都重复“fopen,fwrite或fprintf或fputs,期间可能fflush,fclose”这个过程 这种情况下依我看只能如下处理了:
#include <sys/types.h>
#include <sys/stat.h>
#include <io.h>
#include <windows.h>
__int64 fl;
int n,r;
struct _stati64 st;

fl=-1i64;
n=0;
while (1) {
    r=_stati64("等待别的程序写完的文件名",&st);
    if (0==r) {
        if (fl==-1i64) {
            fl=st.st_size;
        } else {
            if (fl!=st.st_size) {
                fl=st.st_size;
                printf("别的程序没写完\n");
                n=0;
            }
        }
        n++;
        if (n>30) {
            printf("别的程序30秒都没写,当作其已经写完。\n");
            break;
        }
        Sleep(1000);
    } else {
        printf("等待别的程序写完的文件名 不存在\n");
        break;
    }
}
风叶落 2014-03-26
  • 打赏
  • 举报
回复
引用 7 楼 zhao4zhong1 的回复:
难者不会,会者不难。
#include <sys\stat.h>
#include <io.h>
#include <fcntl.h>
#include <share.h>
#include <windows.h>

int fh,n;
n=0;
while (1) {
 Sleep(1000);
fh=_sopen("等待别的程序写完的文件名",_O_BINARY|_O_RDONLY|_O_RANDOM,_SH_DENYWR);
if (fh>=0) {
 _close(fh);
 printf("别的程序已写完\n");
 break;
} else {
 printf("别的程序没写完\n");
 n++;
 if (n>30) {
  printf("等待别的程序写完30秒超时!\n");
  break;
 }
}
}
不是很明白,_O_BINARY|_O_RDONLY|_O_RANDOM这一串代表什么,是指独占方式打开么?这个试过了,不可行。
buyong 2014-03-26
  • 打赏
  • 举报
回复
引用 5 楼 zhaowech 的回复:
[quote=引用 4 楼 liao05050075 的回复:] 写个程序,以独占或者加文件锁的方式打开文件,如果可以独占,说明已经没有人持有该文件句柄
这也不靠谱,A程序并不是一直都占着文件,若果每次的读写都去打开关闭文件,在下次间隙被你独占了,仍然不代表文件生成完了[/quote] 那就检测A程序是否存在,不存在时传文件
赵4老师 2014-03-26
  • 打赏
  • 举报
回复
难者不会,会者不难。
#include <sys\stat.h>
#include <io.h>
#include <fcntl.h>
#include <share.h>
#include <windows.h>

int fh,n;
n=0;
while (1) {
 Sleep(1000);
fh=_sopen("等待别的程序写完的文件名",_O_BINARY|_O_RDONLY|_O_RANDOM,_SH_DENYWR);
if (fh>=0) {
 _close(fh);
 printf("别的程序已写完\n");
 break;
} else {
 printf("别的程序没写完\n");
 n++;
 if (n>30) {
  printf("等待别的程序写完30秒超时!\n");
  break;
 }
}
}
PDD123 2014-03-25
  • 打赏
  • 举报
回复
完全没办法准确判断。 你得仔细分析A的行为,看看有什么明显的特征表明文件已经写完。
孤影品茗 2014-03-25
  • 打赏
  • 举报
回复
引用 4 楼 liao05050075 的回复:
写个程序,以独占或者加文件锁的方式打开文件,如果可以独占,说明已经没有人持有该文件句柄
这也不靠谱,A程序并不是一直都占着文件,若果每次的读写都去打开关闭文件,在下次间隙被你独占了,仍然不代表文件生成完了
liao05050075 2014-03-25
  • 打赏
  • 举报
回复
写个程序,以独占或者加文件锁的方式打开文件,如果可以独占,说明已经没有人持有该文件句柄
逸萌 2014-03-25
  • 打赏
  • 举报
回复
引用 2 楼 u010603437 的回复:
[quote=引用 1 楼 liao05050075 的回复:] 想办法让A生成结束后发个信号出来。。比如恶心点,你可以在A生成a.txt完成后,再写个b.txt,当你看到b.txt出来了,就说明a.txt写完了。。
不行,程序A不归我管,也不提供接口。[/quote] 那就没有办法了,没有办法检测文件生成结束, 文件总可能随时写的
风叶落 2014-03-25
  • 打赏
  • 举报
回复
引用 1 楼 liao05050075 的回复:
想办法让A生成结束后发个信号出来。。比如恶心点,你可以在A生成a.txt完成后,再写个b.txt,当你看到b.txt出来了,就说明a.txt写完了。。
不行,程序A不归我管,也不提供接口。
liao05050075 2014-03-25
  • 打赏
  • 举报
回复
想办法让A生成结束后发个信号出来。。比如恶心点,你可以在A生成a.txt完成后,再写个b.txt,当你看到b.txt出来了,就说明a.txt写完了。。

64,641

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧