VFP中取文件大小的问题

时间:2021-04-17 09:27:39
使用FSIZE,ADIR这两个函数取文件大小的时候发现一个问题,返回的文件大小是9位的,如果文件字节数超过9位,返回的文件大小就不对了,不知道该怎么办。

18 个解决方案

#1


举例说明

#2


本帖最后由 apple_8180 于 2010-04-15 09:44:15 编辑
9位数 那就是95G以上,1个文件这么大?

#3


本帖最后由 dkfdtf 于 2010-04-15 09:45:33 编辑
set compatible on
? eval(trans(fsize('c:\aaa.iso'),'@0'))

#4


我一个文件4个多G,用FSIZE()出来的是172935165,这个显然有问题的。
9位字节大概也就976M,现在比这个大的文件很多了,我定期查数据库的备份文件是否正确,数据库的文件在10G左右
? eval(trans(fsize('c:\aaa.iso'),'@0'))
这个语句用了效果是一样的,还有没有什么办法?

#5


用 Fsize() 前要行执行:
SET COMPATIBLE ON

#6


9位数:
?100000000/1024/1024

得到95.37G

#7


我用 vfp9,用上面的代码测试一个 4G 左右的 DVD 映像文件没问题,返回正确的字节数

#8


我用的是VFP6,怎么试都不行,估计是软件本身问题,估计当时定位的时候没想到会这么大。
想用seek来做,结果fopen打开网络盘符的文件居然返回-1,我彻底晕了

?100000000/1024/1024
这个出来的95.37是兆
fsize返回的是字节数
1M=1024K
1k=1024B

#9


引用 8 楼 emmet2000 的回复:
我用的是VFP6,怎么试都不行,估计是软件本身问题,估计当时定位的时候没想到会这么大。
想用seek来做,结果fopen打开网络盘符的文件居然返回-1,我彻底晕了

?100000000/1024/1024
这个出来的95.37是兆
fsize返回的是字节数
1M=1024K
1k=1024B


是我搞错了,少除一个1024

#10


我Fsize 和 ADIR 取得的文件大小均正常,我测试的是2G多的文件

#11


本帖最后由 dkfdtf 于 2010-04-15 11:12:28 编辑
我用 vfp9,fsize 函数读取那个 4G 大小的文件时,返回指数形式的负值。

vfp6 的话,自己做一个函数转换一下,主要代码如下:

set compatible on
m.lnSize = fsize('c:\aaa.iso')
m.lcSize = substr(trans(m.lnSize, '@0'), 3)
? eval('0x'+left(m.lcSize,4))*0x10000 + eval('0x'+right(m.lcSize,4))

我没有 vfp6,需要你自己试试是否可行。

#12


实验过了,VFP6下面不行,应该是本身的位数就不够,所以没办法,看来要上VFP9了,哪里有完整点的简体中文版本下载啊。

#14


一个四G多的文件大小用于32位的数显示,明显已经溢出,而楼主所提到的将要用到的是10G的文件大小,我想就是用VFP9都估计读不出来,建议还是用API函数去读,有这么个函数GetFileSizeEx

#15


能否帮忙给个GetFileSizeEx应用的例子,没调用过API函数,谢谢了

#16


*我测式了一个 2.52G 的文件,用

Clear
Set Compatible On
? Evaluate(Transform(Fsize('D:\Program Files\Microsoft SQL Server\MSSQL\Data\onefinger.mdf'),'@0'))/1024/1024/1024 &&得到 GB

*与下面API 得到的文件都是一样的,都是对的

Declare Integer OpenFile In kernel32 String lpFileName,String @lpReOpenBuff,Integer wStyle
Declare Integer GetFileSize In kernel32 Integer hFile,String @lpFileSize
Declare Integer CloseHandle In kernel32 Integer hObject
lcReOpenBuff=Space(254)
lnHFile=OpenFile("D:\Program Files\Microsoft SQL Server\MSSQL\Data\onefinger.mdf",@lcReOpenBuff,0)
If lnHFile>0
lcFileSize=Space(254)
lnFileSize=Evaluate(Transform(GetFileSize(lnHFile, @lcFileSize),'@0'))/1024/1024/1024 &&得到 GB
?lnFileSize
CloseHandle(lnHFile)
Endif

#17


太感谢了,明天回公司试验下。

#18


该回复于2010-04-16 05:32:52被版主删除

#1


举例说明

#2


本帖最后由 apple_8180 于 2010-04-15 09:44:15 编辑
9位数 那就是95G以上,1个文件这么大?

#3


本帖最后由 dkfdtf 于 2010-04-15 09:45:33 编辑
set compatible on
? eval(trans(fsize('c:\aaa.iso'),'@0'))

#4


我一个文件4个多G,用FSIZE()出来的是172935165,这个显然有问题的。
9位字节大概也就976M,现在比这个大的文件很多了,我定期查数据库的备份文件是否正确,数据库的文件在10G左右
? eval(trans(fsize('c:\aaa.iso'),'@0'))
这个语句用了效果是一样的,还有没有什么办法?

#5


用 Fsize() 前要行执行:
SET COMPATIBLE ON

#6


9位数:
?100000000/1024/1024

得到95.37G

#7


我用 vfp9,用上面的代码测试一个 4G 左右的 DVD 映像文件没问题,返回正确的字节数

#8


我用的是VFP6,怎么试都不行,估计是软件本身问题,估计当时定位的时候没想到会这么大。
想用seek来做,结果fopen打开网络盘符的文件居然返回-1,我彻底晕了

?100000000/1024/1024
这个出来的95.37是兆
fsize返回的是字节数
1M=1024K
1k=1024B

#9


引用 8 楼 emmet2000 的回复:
我用的是VFP6,怎么试都不行,估计是软件本身问题,估计当时定位的时候没想到会这么大。
想用seek来做,结果fopen打开网络盘符的文件居然返回-1,我彻底晕了

?100000000/1024/1024
这个出来的95.37是兆
fsize返回的是字节数
1M=1024K
1k=1024B


是我搞错了,少除一个1024

#10


我Fsize 和 ADIR 取得的文件大小均正常,我测试的是2G多的文件

#11


本帖最后由 dkfdtf 于 2010-04-15 11:12:28 编辑
我用 vfp9,fsize 函数读取那个 4G 大小的文件时,返回指数形式的负值。

vfp6 的话,自己做一个函数转换一下,主要代码如下:

set compatible on
m.lnSize = fsize('c:\aaa.iso')
m.lcSize = substr(trans(m.lnSize, '@0'), 3)
? eval('0x'+left(m.lcSize,4))*0x10000 + eval('0x'+right(m.lcSize,4))

我没有 vfp6,需要你自己试试是否可行。

#12


实验过了,VFP6下面不行,应该是本身的位数就不够,所以没办法,看来要上VFP9了,哪里有完整点的简体中文版本下载啊。

#13


#14


一个四G多的文件大小用于32位的数显示,明显已经溢出,而楼主所提到的将要用到的是10G的文件大小,我想就是用VFP9都估计读不出来,建议还是用API函数去读,有这么个函数GetFileSizeEx

#15


能否帮忙给个GetFileSizeEx应用的例子,没调用过API函数,谢谢了

#16


*我测式了一个 2.52G 的文件,用

Clear
Set Compatible On
? Evaluate(Transform(Fsize('D:\Program Files\Microsoft SQL Server\MSSQL\Data\onefinger.mdf'),'@0'))/1024/1024/1024 &&得到 GB

*与下面API 得到的文件都是一样的,都是对的

Declare Integer OpenFile In kernel32 String lpFileName,String @lpReOpenBuff,Integer wStyle
Declare Integer GetFileSize In kernel32 Integer hFile,String @lpFileSize
Declare Integer CloseHandle In kernel32 Integer hObject
lcReOpenBuff=Space(254)
lnHFile=OpenFile("D:\Program Files\Microsoft SQL Server\MSSQL\Data\onefinger.mdf",@lcReOpenBuff,0)
If lnHFile>0
lcFileSize=Space(254)
lnFileSize=Evaluate(Transform(GetFileSize(lnHFile, @lcFileSize),'@0'))/1024/1024/1024 &&得到 GB
?lnFileSize
CloseHandle(lnHFile)
Endif

#17


太感谢了,明天回公司试验下。

#18


该回复于2010-04-16 05:32:52被版主删除