回 帖 发 新 帖 刷新版面

主题:qb45请再进来,"qb中如何使生成的EXE文件支持长文件名?",

下列条件下,如何使生成的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个回复)

沙发

可以做,但是很麻烦
建议:先用你的代码生成一个短文件名的文件,然后在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

板凳

非常感谢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 楼

需要郑重声明的是,我不是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 楼

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]

我来回复

您尚未登录,请登录后再回复。点此登录或注册