| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5750 人关注过本帖
标题:Adir() 获取文件大小时,不能实时更新?
取消只看楼主 加入收藏
琅拿度
Rank: 1
等 级:新手上路
帖 子:163
专家分:5
注 册:2016-4-7
结帖率:78.57%
收藏
已结贴  问题点数:20 回复次数:12 
Adir() 获取文件大小时,不能实时更新?
Adir(dx,'文件名') && 文件是慢慢变大的,变大的过程未停止

?dx[2]  && 得到的大小不是实时的,如果要得到实时的,必须要在win7界面刷新一下才行,有什么方法解决?

2016-09-20 20:43
琅拿度
Rank: 1
等 级:新手上路
帖 子:163
专家分:5
注 册:2016-4-7
收藏
得分:0 
以下是引用吹水佬在2016-9-20 22:37:34的发言:

观察了一下是实时更新的,是不是更新的内容还在缓存,没有存盘?
STRTOFILE("ABCD", "C:\TEMP\test.txt", 1)
ADIR(af, "C:\TEMP\test.txt")
?af[1], af[2], af[3]
STRTOFILE("ABCD", "C:\TEMP\test.txt", 1)
ADIR(af, "C:\TEMP\test.txt")
?af[1], af[2], af[3]


你的代码是完成后再去看大小,我要做的是VFP去监控一个文件的大小(而这个文件不是VFP去改变大小的,而是另外的程序,这个文件不断变大的)

我的adir 是用timer去定时监控的,但是确一直得到不是实时的数值,要刷新一下才可以得到真实的值。
2016-09-20 22:50
琅拿度
Rank: 1
等 级:新手上路
帖 子:163
专家分:5
注 册:2016-4-7
收藏
得分:0 
以下是引用tlliqi在2016-9-21 07:31:41的发言:

要手动刷新?


是,在win7的资源管理器刷新一下,就可以

(资源管理器也有文件大小的信息,比如刷新前的值是20M, 文件在不断增大,比如过了10分钟,实际大小是80M,它还是显示20M,资源管理器的文件大小也是不实时的,你刷新了才显示80M,我猜是这样的,因为文件还在变动之中,就是不断增大,所以windows也懒得去实时更新,只有windows看到文件没有写入动作了才更新)

2016-09-21 08:11
琅拿度
Rank: 1
等 级:新手上路
帖 子:163
专家分:5
注 册:2016-4-7
收藏
得分:0 
FSIZE() 好像对于大文件返回值不是正确的,如大于4G的文件
2016-09-21 12:46
琅拿度
Rank: 1
等 级:新手上路
帖 子:163
专家分:5
注 册:2016-4-7
收藏
得分:0 
api 搞不懂是什么意思,搜到一些说法,但是一堆东西看不懂,我业余编的
2016-09-21 18:35
琅拿度
Rank: 1
等 级:新手上路
帖 子:163
专家分:5
注 册:2016-4-7
收藏
得分:0 
以下是引用吹水佬在2016-9-21 19:28:23的发言:

文件操作的API有不少
如:
*方法一
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)
    nSize = GetFileSize(hFile, 0)
    ? nSize
    CloseHandle(hFile)
ENDIF


*方法二
DECLARE LONG FindFirstFile IN Kernel32 STRING@, STRING@
DECLARE LONG FindClose IN Kernel32 LONG

stFI = REPLICATE(0h00, 320)
hFile = FindFirstFile("C:\TEMP\test.txt" , @stFI)
IF (hFIle != -1)
    nSize = CTOBIN(SUBSTR(stFI,33,4), "4RS")
    ? nSize
    FindClose(hFile)
ENDIF


非常感谢,应该可以解决了,我也查过一下一些API,但实在不知道这几个 LONG LONG LONG 代表什么东西,然后你是怎么知道括号里的几个数字该怎么用的呢?
2016-09-21 20:50
琅拿度
Rank: 1
等 级:新手上路
帖 子:163
专家分:5
注 册:2016-4-7
收藏
得分:0 
以下是引用吹水佬在2016-9-21 19:28:23的发言:

文件操作的API有不少
如:
*方法一
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)
    nSize = GetFileSize(hFile, 0)
    ? nSize
    CloseHandle(hFile)
ENDIF


*方法二
DECLARE LONG FindFirstFile IN Kernel32 STRING@, STRING@
DECLARE LONG FindClose IN Kernel32 LONG

stFI = REPLICATE(0h00, 320)
hFile = FindFirstFile("C:\TEMP\test.txt" , @stFI)
IF (hFIle != -1)
    nSize = CTOBIN(SUBSTR(stFI,33,4), "4RS")
    ? nSize
    FindClose(hFile)
ENDIF


两个方法貌似对大于2G的文件也不准确?

[此贴子已经被作者于2016-9-21 20:56编辑过]

2016-09-21 20:53
琅拿度
Rank: 1
等 级:新手上路
帖 子:163
专家分:5
注 册:2016-4-7
收藏
得分:0 
Declare Long FindFirstFile In Kernel32 String@, String@
Declare Long FindClose In Kernel32 Long

stFI = Replicate(0h00, 320)
hFile = FindFirstFile("E:\test.rar" , @stFI)

If (hFIle != -1)
    nLSize = CToBin(Substr(stFI,33,4), "4RS")
    nHSize = CToBin(Substr(stFI,29,4), "4RS")
    size_real=((nHSize*4*1024*1024*1024)+IIF(nLSize>=0,nLSize,4*1024*1024*1024+nLSize))/1024/1024
    ? size_real && 单位 M
    FindClose(hFile)
Endif
2016-09-22 00:31
琅拿度
Rank: 1
等 级:新手上路
帖 子:163
专家分:5
注 册:2016-4-7
收藏
得分:0 
以下是引用吹水佬在2016-9-21 23:24:08的发言:


之前不是说了吗?VFP是32位编译的,整数的最大值0x7FFFFFFF(2,147,483,647),VFP的数值类型不能处理超过这个限制。
可试试用字符串表示形式来处理超大数值。
上面提到的方法二,文件大小是分高位(32位)低位(32位)存放的,示例只取低位。
试试高低位都取出来看看。
 nHSize = CTOBIN(SUBSTR(stFI,29,4), "4RS")
 nLSize = CTOBIN(SUBSTR(stFI,33,4), "4RS")


搞定了!非常感谢

Declare Long FindFirstFile In Kernel32 String@, String@
Declare Long FindClose In Kernel32 Long

stFI = Replicate(0h00, 320)
hFile = FindFirstFile("E:\test.rar" , @stFI)

If (hFIle != -1)
    nLSize = CToBin(Substr(stFI,33,4), "4RS")
    nHSize = CToBin(Substr(stFI,29,4), "4RS")
    size_real=((nHSize*4*1024*1024*1024)+IIF(nLSize>=0,nLSize,4*1024*1024*1024+nLSize))/1024/1024
    ? size_real && 单位 M
    FindClose(hFile)
Endif
2016-09-22 00:31
琅拿度
Rank: 1
等 级:新手上路
帖 子:163
专家分: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
快速回复:Adir() 获取文件大小时,不能实时更新?
数据加载中...
 
   



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

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