| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5681 人关注过本帖
标题:Adir() 获取文件大小时,不能实时更新?
只看楼主 加入收藏
琅拿度
Rank: 1
等 级:新手上路
帖 子:162
专家分:5
注 册:2016-4-7
收藏
得分:0 
以下是引用吹水佬在2016-9-22 16:59:50的发言:

按微软的说法,这个高低位数值是:
_INT64 RealSize = ((__INT64)nFileSizeHigh * (MAXDWORD+1)) + (__INT64)nFileSizeLow
其中:MAXDWORD 是 0x0ffffffff
也就是说:size_real = nHSize*0x100000000 + nLSize


我测试到的规律是:
1小于2g,高位0,低位正数
2大于2g,高位0,低位负数 (小于4g)
3大于4g,高位1,低位正数 (小于6g)
4大于6g,(没这么大的文件,未测,我猜测高位是1,低位是负数,所以我就暂时下了结论了)
2016-09-22 18:11
琅拿度
Rank: 1
等 级:新手上路
帖 子:162
专家分:5
注 册:2016-4-7
收藏
得分:0 
以下是引用吹水佬在2016-9-22 16:59:50的发言:

按微软的说法,这个高低位数值是:
_INT64 RealSize = ((__INT64)nFileSizeHigh * (MAXDWORD+1)) + (__INT64)nFileSizeLow
其中:MAXDWORD 是 0x0ffffffff
也就是说:size_real = nHSize*0x100000000 + nLSize


晕倒了! 这个也是要在资源管理器刷新的,要不然得到的大小也是不实时的...

VFP有什么办法让某个目录定时刷新吗?
2016-09-22 18:45
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10527
专家分:42899
注 册:2014-5-20
收藏
得分:0 
以下是引用琅拿度在2016-9-22 18:11:42的发言:



我测试到的规律是:
1小于2g,高位0,低位正数
2大于2g,高位0,低位负数 (小于4g)
3大于4g,高位1,低位正数 (小于6g)
4大于6g,(没这么大的文件,未测,我猜测高位是1,低位是负数,所以我就暂时下了结论了)

这里要注意的是:WIN32_FIND_DATA结构成员nFileSizeHigh和nFileSizeLow是DWORD类型(32位无符号),VFP的CTOBIN()是有符号处理,不能直接返回无符号数值,可以自定义一个函数逐个字节处理。
2016-09-22 18:59
琅拿度
Rank: 1
等 级:新手上路
帖 子:162
专家分:5
注 册:2016-4-7
收藏
得分:0 
以下是引用吹水佬在2016-9-22 18:59:13的发言:


这里要注意的是:WIN32_FIND_DATA结构成员nFileSizeHigh和nFileSizeLow是DWORD类型(32位无符号),VFP的CTOBIN()是有符号处理,不能直接返回无符号数值,可以自定义一个函数逐个字节处理。


我消化一下,不过这个不是实时更新的问题怎么办才好啊?
2016-09-22 19:03
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10527
专家分:42899
注 册:2014-5-20
收藏
得分:0 
以下是引用琅拿度在2016-9-22 18:45:42的发言:



晕倒了! 这个也是要在资源管理器刷新的,要不然得到的大小也是不实时的...

VFP有什么办法让某个目录定时刷新吗?

FindFirstFile()实际是用来检索文件表,不针对文件内容。
试试 CreateFile() 或 VFP的 FOPEN()+ FSEEK(),这些是针对文件内容操作,但因为是其他进程处理的文件,如果VFP也不能OPEN这个文件就不好处理。
2016-09-22 19:06
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10527
专家分:42899
注 册:2014-5-20
收藏
得分:0 
示例1, 用CreateFile()
DECLARE LONG CreateFile IN Kernel32 STRING@, LONG, LONG, LONG, LONG, LONG, LONG
DECLARE LONG GetFileSize IN Kernel32 LONG, LONG@
DECLARE LONG CloseHandle IN Kernel32 LONG

hFile = CreateFile("C:\TEMP\test.txt", 8, 1, 0, 3, 0, 0)
IF (hFIle != -1)
    nHSize = 0
    nLSize = GetFileSize(hFile, @nHSize)
    CloseHandle(hFile)
    ? nHSize * 0x100000000 + nLSize
ENDIF

示例2, 用 FOPEN()+FSEEK()
hFile = FOPEN("C:\TEMP\test.txt")
IF (hFIle > 0)
    nSize = FSEEK(hFile, 0, 2)
    FCLOSE(hFile)
    ? nSize
ENDIF
2016-09-22 19:30
琅拿度
Rank: 1
等 级:新手上路
帖 子:162
专家分:5
注 册:2016-4-7
收藏
得分:0 
以下是引用吹水佬在2016-9-22 19:30:51的发言:

示例1, 用CreateFile()
DECLARE LONG CreateFile IN Kernel32 STRING@, LONG, LONG, LONG, LONG, LONG, LONG
DECLARE LONG GetFileSize IN Kernel32 LONG, LONG@
DECLARE LONG CloseHandle IN Kernel32 LONG

hFile = CreateFile("C:\TEMP\test.txt", 8, 1, 0, 3, 0, 0)
IF (hFIle != -1)
    nHSize = 0
    nLSize = GetFileSize(hFile, @nHSize)
    CloseHandle(hFile)
    ? nHSize * 0x100000000 + nLSize
ENDIF

示例2, 用 FOPEN()+FSEEK()
hFile = FOPEN("C:\TEMP\test.txt")
IF (hFIle > 0)
    nSize = FSEEK(hFile, 0, 2)
    FCLOSE(hFile)
    ? nSize
ENDIF


实例1解决了,非常感谢!基础很差啊,虽然写了好几个软件了
2016-09-22 21:53
快速回复:Adir() 获取文件大小时,不能实时更新?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015210 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved