主题:qb45请再进来,"qb中如何使生成的EXE文件支持长文件名?",
gczxhzb
[专家分:0] 发布于 2005-05-23 12:18:00
下列条件下,如何使生成的EXE文件在DOS中支持长文件名?
1.DOS系统支持长文件名;
2.已用DOSLFN /C- /Z:CP437UNI.TBL为DOS提供LFN(长文件名)接口。
比如我要在C盘的MyDownloads(这是个长文件名)写入一个文本文件gcz.txt,主要程序代码如下:
f$ = "c:\MyDownloads\gcz.txt"
OPEN f$ FOR OUTPUT AS #1
PRINT #1,f$
ClOSE #1
大侠能不能帮我。
回复列表 (共4个回复)
沙发
qb45 [专家分:2880] 发布于 2005-05-20 15:19:00
可以做,但是很麻烦
建议:先用你的代码生成一个短文件名的文件,然后在QB中调用中断把短文件改成长文件名
文件改名相对来说是很简单的,为了确保正确无误,我在WIN98的MSDOS方式下用QB45运行成功!然后给你发上来(如果打开文件到写入文件都完全用长文件的方式的话,代码太长了)
例子:
假如你的同目录下有各test1.txt的这个文件,你运行后会改名为testabcdefgh.txt
源程序如下:
OldFile$="test1.txt"
NewFile$="testabcdefgh.txt"
IF RenFile%(OldFile$,NewFile$) = 0 THEN PRINT "改名成功 ok"
FUNCTION RenFile% (OldFile$, NewFile$)
'文件改名:入口AH=56 DS:DX=旧文件地址 ES:DI=新
'ax% = 0: bx% = 1: cx% = 2: dx% = 3: bp% = 4
'si% = 5: di% = 6: flags% = 7: ds% = 8: es% = 9
DIM Reg%(9)
Old$ = OldFile$ + CHR$(0)
New$ = NewFile$ + CHR$(0)
Reg%(8) = VARSEG(Old$)
Reg%(3) = SADD(Old$)
Reg%(9) = VARSEG(New$)
Reg%(6) = SADD(New$)
Reg%(0) = &H7156
CALL INT86XOLD(&H21, Reg%(), Reg%())
FileRen% = Reg%(0)
END FUNCTION
板凳
gczxhzb [专家分:0] 发布于 2005-05-21 22:40:00
非常感谢qb45,您就是写qbwin徐大侠吧!
我是刚刚学qb的,这几天正在研究您在qbwin技术论坛发表的《长文件名各种功能调用》的源码,其中关于中断的调用我还不懂,我会努力学习的!
我想继续问长文件名的问题:
1、用qbwin制作的bas经qb7.1生成exe文件后是否支持长文件名读写?如果不能,要调用长文件名读写模块,该如何启动qb,是qbx /l,还是qbx /l qbwin?程序开始处的语句应该如何写,除了'$INCLUDE: 'QBWIN.BI' '$INCLUDE: 'QBWIN.DAT'这两句外,还要不要加上'$INCLUDE:'QBX.BI'这一句?(我一直用QB7.1)
2、您这次给我的函数是写长文件名文件的,我想要的是既能读又能写的那种,能满足我吗?
3、如果调用了长文件名读写支持模块,生成的exe文件在dos7下运行是否需要运行doslfn这类长文件名支持程序?
再次感谢qb45的帮助!
3 楼
qb45 [专家分:2880] 发布于 2005-05-23 16:57:00
需要郑重声明的是,我不是QBWIN的作者,(QBWIN完全是免费的提供大家使用,并且提供QLB,LIB两种库,在这点上我对于作者,是非常敬佩的,互联网的精神就是自由共享)
qbwin是用qb7.1制作的,而qb7.1我不用,论坛里很多网友还是都用qb7.1版本的,也有很多人都是先接触了qbwin然后学习qb的,有关qbwin和qb7.1方面的应用和问题,我想你问他们要比问我的效果好!
用qbwin制作的bas经qb7.1生成exe文件应该不支持长文件名读写!
如果你调用了长文件名模块,无需使用DOSLFN!
要能读能写的模块,应用起来是很麻烦的,不是一般的麻烦,比如用OPEN PRINT 这两个语句就能完成文件的写入,如果用模块的话就非常复杂了,而且对计算机的最基本的一些原理不清楚的话很难得心应手的用,很多人对计算机基本原理是不清楚的!
另外我想告诉你的是,我写的长文件名的模块应该是无法在qb7.1下使用的,听网友moz说过qb7.1不支持INT86XOLD这个语句!
所以,我敢肯定你并没有运行一下我的这个程序!
4 楼
moz [专家分:37620] 发布于 2005-05-23 18:24:00
TO:老大qb45
不好意思,我看了一下qb7.1的预定义文件qbx.bi,里面是有预定义 in86xold 过程的,但我不知道我的qb7.1下的系统文件出了什么问题,你的中断例程在7.1用不了,只能搞到4.5那去运行。我想这应该是我个人的问题,应该不会是系统的问题。
TO: gczxhzb
QB是DOS下的事物,是不支持长文件名的,至于你的长文件接口,我还不懂,见识浅薄,没用过。
还是按照qb45前面说的办法好点,先把你需要的文件搞好,再调用qb45的改名函数把文件名改成你需要的文件就可以了,至于目录,本来也可以按照中断的思想调用一下系统的,但我对于汇编不大拿手,只好利用一下shell了。
DOS只支持8+3的文件,你就让QB支持8位的长度好了。
defint
on error goto 0
f$ = "c:\MyDownloads\gcz.txt"
temp2$="temp~2.txt"
if mid$(f$,2,1)=":" then c$=left$(f$,2) '[color=0000FF]盘符[/color]
do
k2=k
k=t
t=instr(k+1,f$,"\")
loop until t=0
if k>0 then
p$=left$(f$,k) '[color=0000FF]目录路径[/color]
n$=mid$(f$,k+1) '[color=0000FF]文件名[/color]
chdrive c$ '[color=0000FF]需要的驱动器[/color]
chdir "\" '[color=0000FF]根目录[/color]
if k2<3 then '[color=0000FF]目录路径操作[/color]
t$=c$
elseif k>0 and k2>0 then
t$=mid$(f$,k2+1,k-k2-1)
t$=file8$(t$,1)
chdir t$ '[color=0000FF]t$就是你需要的目录路径了[/color]
end if
f2=freefile
open "temp~2.txt" for output as f2#
close f2#
if renfile(temp2$,n$)=0 then system '[color=0000FF]调用一下qb45的改名过程,[/color]
'[color=0000FF]不成功就退出或其他操作[/color]
nf$=file8$(n$,0) '[color=0000FF]nf$就是你需要的文件的绝对路径文件名,你可以把它当作文件名直接操作就行了。[/color]
'[color=0000FF]获取8+3格式目录文件名函数[/color]
function file8$(t$,a)
temp1$="\temp~1.txt" '[color=0000FF]临时文件,用完记得删除[/color]
t$=left$(t$,6)+"*.*" '[color=0000FF]只取前面6位字符,不够6位也没事的[/color]
if a=1 then '[color=0000FF]目录操作[/color]
o$="dir "+t$+"*.*/ad/s>"+temp1$
fi$="<DIR>"
else '[color=0000FF]文件操作[/color]
o$="dir "+t$+"*.*/s>"+temp1$
fi$=left$(t$,2) '[color=0000FF]这更模糊了,也没办法,有些中文名会不一样的[/color]
endif
shell o$ '[color=0000FF]搜索所有目录,没办法,用*.*的确模糊[/color]
f2#=freefile
open temp1$ for input as f2#
do until eof(f2)
line input #f2,a$
if instr(1,a$," Dirctory of ")then pa$=mid$(a$,15)
'[color=0000FF]这一句要小心点,版本不一样,dir的格式也不一样的,具体要看你dir的结果作相应的改变,dos的dir,windows的dir,还有运行了HHDOS的UCDOS的dir也不一样的。[/color]
if instr(1,a$,fi$)then
if rtrim$(mid$(a$,10,3))="" then
pb$=rtrim$(left$(a$,8)) '[color=0000FF]无扩展名[/color]
else
pb$=rtrim$(mid$(a$,12))
mid$(pb$,9,1)="." '[color=0000FF]有扩展名[/color]
end if
exit do
endif
loop
close #f2
kill temp1$
file8$=pa$+"\"+pb$ '[color=0000FF]完整绝对路径[/color]
end function
function renfile(a$,b$)
'[color=0000FF]这里请剽窃qb45的产品,嘻嘻[/color]
end function
[color=0000FF] 最后还要告诉你,这个东西我没试运行过的,只是凭空想像出来的东西,你还要根据你具体需要和具体dir格式作相应的修改。祝你好运。[/color]
我来回复