请教高手问题,怎么判断文件的完整性?

时间:2021-09-16 04:00:15
用vb写了一个小程序,功能就是从网络上一台机器上的共享目录,不定时扫描共享目录,如果有新文件就copy到本机,删除共享目录的新文件,然后通过程序处理,写数据到指定的数据库。我去读文件和写数据库的是同一个局域网,共享目录文件的来源是远端客户用ftp不定时传上来的,问题是:如果ftp的文件还没有完成,我的程序去扫描共享目录,这时就会出错,处理的文件不完整。请教高手,怎么样判断文件完整性?100分相送,不够请说!

12 个解决方案

#1


怎么没人说话啊!!大虾们!

#2


那就用错误处理判断!

#3


方法1
检测到新文件后不要立即处理,读取其长度,下次扫描时,如果长度相同,则处理,否则再如上等待。
这个方法的关键是扫描间隔要足以使上传的文件长度有变化。

方法2
远端客户上传文件文成后,上传一个0字节规定扩展名的同名文件。检测时只检测此标志文件,检测到即处理同名文件。

#4


up

#5


用下面的api,取的文件的最后写入时间
Public Declare Function GetFileInformationByHandle Lib "kernel32" Alias "GetFileInformationByHandle" (ByVal hFile As Long, lpFileInformation As BY_HANDLE_FILE_INFORMATION) As Long

Public Type BY_HANDLE_FILE_INFORMATION
        dwFileAttributes As Long
        ftCreationTime As FILETIME
        ftLastAccessTime As FILETIME  
        ftLastWriteTime As FILETIME   '文件的最后写入时间
        dwVolumeSerialNumber As Long
        nFileSizeHigh As Long
        nFileSizeLow As Long
        nNumberOfLinks As Long
        nFileIndexHigh As Long
        nFileIndexLow As Long
End Type

#6


取的文件的最后写入时间,和目前的时间对比,判断是否写完!

#7


感谢of123()提供的方法,觉得方法1是可行的,不过处理起来可能麻烦一点。方法2可能我这里不行了,他们不会这样做的。
谢谢你给的这个思维:)
如果有好的方法,请高手发言!等待你们的答案,要不我结算分数了!

#8


取的文件的最后写入时间,和目前的时间对比,判断是否写完!
请问qianfubin(慕白),这是什么意思,是指前一次扫描的时间和下一次的比较吗? 按照of123()的方法1的思维是吗?也就是前一次扫描到的文件和下一次的文件时间相比,看有没有变化!然后再做处理?

#9


如果文件的最后写入时间和当前扫描时间一致(可以设定时间差:比如时间差小于<10秒),那就说明还在写文件。

#10


把文件写进数据库

#11


一般的文件(除数据库以外)可以用长度为0来检验(新文件),因为无论文件多长
在未写完之前长度都是0。此方法还可以跳过0文件。另外,再用错误处理就可以了
COPY文件要用COPY命令,然后就可以通过时间(FILEDATETIME)比较文件是否更新了。

#12


To:tanyx(不知道)
你这种说法好像有问题吧!ftp上传文件,应该是一点一点增加的,直到文件完成。如果是copy的话就不是很清楚了,没做测试。
请教 qianfubin(慕白)
你那api,传值怎么样得到结果呢!不是很明白。

#1


怎么没人说话啊!!大虾们!

#2


那就用错误处理判断!

#3


方法1
检测到新文件后不要立即处理,读取其长度,下次扫描时,如果长度相同,则处理,否则再如上等待。
这个方法的关键是扫描间隔要足以使上传的文件长度有变化。

方法2
远端客户上传文件文成后,上传一个0字节规定扩展名的同名文件。检测时只检测此标志文件,检测到即处理同名文件。

#4


up

#5


用下面的api,取的文件的最后写入时间
Public Declare Function GetFileInformationByHandle Lib "kernel32" Alias "GetFileInformationByHandle" (ByVal hFile As Long, lpFileInformation As BY_HANDLE_FILE_INFORMATION) As Long

Public Type BY_HANDLE_FILE_INFORMATION
        dwFileAttributes As Long
        ftCreationTime As FILETIME
        ftLastAccessTime As FILETIME  
        ftLastWriteTime As FILETIME   '文件的最后写入时间
        dwVolumeSerialNumber As Long
        nFileSizeHigh As Long
        nFileSizeLow As Long
        nNumberOfLinks As Long
        nFileIndexHigh As Long
        nFileIndexLow As Long
End Type

#6


取的文件的最后写入时间,和目前的时间对比,判断是否写完!

#7


感谢of123()提供的方法,觉得方法1是可行的,不过处理起来可能麻烦一点。方法2可能我这里不行了,他们不会这样做的。
谢谢你给的这个思维:)
如果有好的方法,请高手发言!等待你们的答案,要不我结算分数了!

#8


取的文件的最后写入时间,和目前的时间对比,判断是否写完!
请问qianfubin(慕白),这是什么意思,是指前一次扫描的时间和下一次的比较吗? 按照of123()的方法1的思维是吗?也就是前一次扫描到的文件和下一次的文件时间相比,看有没有变化!然后再做处理?

#9


如果文件的最后写入时间和当前扫描时间一致(可以设定时间差:比如时间差小于<10秒),那就说明还在写文件。

#10


把文件写进数据库

#11


一般的文件(除数据库以外)可以用长度为0来检验(新文件),因为无论文件多长
在未写完之前长度都是0。此方法还可以跳过0文件。另外,再用错误处理就可以了
COPY文件要用COPY命令,然后就可以通过时间(FILEDATETIME)比较文件是否更新了。

#12


To:tanyx(不知道)
你这种说法好像有问题吧!ftp上传文件,应该是一点一点增加的,直到文件完成。如果是copy的话就不是很清楚了,没做测试。
请教 qianfubin(慕白)
你那api,传值怎么样得到结果呢!不是很明白。