opendir,readdir 的问题

frazer 2009-07-09 11:23:23
假设我扫描的目录为 $DATAPATH,这个目录下会有个文件file1,每当我readdir得到的结果为file1时我就处理该文件。
但是,file1是别的程序从其他的地方拷贝过来,文件很大,readdir得到的文件会不完整,
如何避免这个问题?

...全文
162 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Wolf0403 2009-07-10
  • 打赏
  • 举报
回复
如果确保复制文件的进程不会中途失败,可以 lsof /file 检查是否有进程正在写入这个文件。
Wolf0403 2009-07-10
  • 打赏
  • 举报
回复
简单的说,只有复制这个文件的进程知道复制是否成功,所以所有的手脚都应该由复制这个文件的进程去做:

1、使用临时文件名,当复制完成,经过校验之后,再改名为目标文件名(如用 ~copy_file_XXX.tmp 等名字)
2、复制文件之前先复制一个同名.MD5SUM 的文件,写上源文件的 MD5 checksum 值;这样利用文件的进程可以自己做检查。
3、等等,扩展性思维吧。
frazer 2009-07-09
  • 打赏
  • 举报
回复
我并不知道文件file1被拷贝来之前的cksum结果,所以cksum也就行不通
有没有其他的方法,通过什么属性之类的能判断出来吗
Treazy 2009-07-09
  • 打赏
  • 举报
回复
你的问题实际上就是想知道其他程序何时完成文件copy

当你readdir到文件file1时,可以对其进行改名操作/rm,或者计算checksum/cksum等操作
如果成功则说明文件已经完成,之后就可以对其进行操作了
Treazy 2009-07-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 frazer 的回复:]
我并不知道文件file1被拷贝来之前的cksum结果,所以cksum也就行不通
有没有其他的方法,通过什么属性之类的能判断出来吗
[/Quote]

我又没让你去比较checksum
只是对一个存在的文件进行cksum操作
如果文件还未完全拷贝完/或者说资源正忙碌,其是无法得到checksum的
frazer 2009-07-09
  • 打赏
  • 举报
回复
我的意思是opendir,然后readdir,这个时候得到的文件可能还没被完全拷贝到这个目录下,我这样就只能得到文件的一部分了
我不清楚这个文件是否在被拷贝。

  • 打赏
  • 举报
回复
比较实用的是,在拷贝的时候,使用另一个文件锁来同步。
ShowMan 2009-07-09
  • 打赏
  • 举报
回复
tripwire和AIDE

23,125

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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