| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6023 人关注过本帖
标题:Adir() 获取文件大小时,不能实时更新?
只看楼主 加入收藏
琅拿度
Rank: 1
等 级:新手上路
帖 子:166
专家分:5
注 册:2016-4-7
收藏
得分:0 
FSIZE() 好像对于大文件返回值不是正确的,如大于4G的文件
2016-09-21 12:46
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
以下是引用琅拿度在2016-9-21 12:46:18的发言:

FSIZE() 好像对于大文件返回值不是正确的,如大于4G的文件

VFP本身是32位编译,单个文件大小限制也只是2G吧?
2016-09-21 14:10
琅拿度
Rank: 1
等 级:新手上路
帖 子:166
专家分:5
注 册:2016-4-7
收藏
得分:0 
api 搞不懂是什么意思,搜到一些说法,但是一堆东西看不懂,我业余编的
2016-09-21 18:35
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
回复 13楼 琅拿度
文件操作的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
2016-09-21 19:28
琅拿度
Rank: 1
等 级:新手上路
帖 子:166
专家分: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
等 级:新手上路
帖 子:166
专家分: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: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
以下是引用琅拿度在2016-9-21 20:53:58的发言:



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

之前不是说了吗?VFP是32位编译的,整数的最大值0x7FFFFFFF(2,147,483,647),VFP的数值类型不能处理超过这个限制。
可试试用字符串表示形式来处理超大数值。
上面提到的方法二,文件大小是分高位(32位)低位(32位)存放的,示例只取低位。
试试高低位都取出来看看。
 nHSize = CTOBIN(SUBSTR(stFI,29,4), "4RS")
 nLSize = CTOBIN(SUBSTR(stFI,33,4), "4RS")
2016-09-21 23:24
琅拿度
Rank: 1
等 级:新手上路
帖 子:166
专家分: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
等 级:新手上路
帖 子:166
专家分: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: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
回复 19楼 琅拿度
按微软的说法,这个高低位数值是:
_INT64 RealSize = ((__INT64)nFileSizeHigh * (MAXDWORD+1)) + (__INT64)nFileSizeLow
其中:MAXDWORD 是 0x0ffffffff
也就是说:size_real = nHSize*0x100000000 + nLSize
2016-09-22 16:59
快速回复:Adir() 获取文件大小时,不能实时更新?
数据加载中...
 
   



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

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