回 帖 发 新 帖 刷新版面

主题:与磁盘,目录,文件显示有关的中断调用源程序

'本程序功能是文件改名,文件列表,目录列表,磁盘列表等等,在WIN98 的MSDOS,QB4.5版本下通过

'定义文件信息缓冲区为本模块公用
COMMON SHARED FileDta$
'定义文件相关信息
TYPE FileRecord
     Attrib AS INTEGER
     hour AS INTEGER
     min AS INTEGER
     sec AS INTEGER
     Day AS INTEGER
     Year AS INTEGER
     Month AS INTEGER
     size AS LONG
     DosName AS STRING * 12
END TYPE
CLS
'下面是用DIR命令列出当前目录下的所有文本文件,然后用本程序的演示这个功能
'调用DOS命令
SHELL "dir *.txt"
'调用本程序中的函数
FileName$ = "*.txt"
DIM File AS FileRecord
IF FindFirstFile%(FileName$, FileAttrib%) = 1 THEN END
DO
  FileInfo File
  PRINT File.DosName, File.size, File.Year; File.Month; File.Day; File.hour; File.min
LOOP WHILE FindNextFile% = 0
'显示系统中的所有驱动器
GetDiskList DiskList$, DiskNum%
SFind% = 1
FOR i = 1 TO DiskNum%
   Find = INSTR(SFind%, DiskList$, CHR$(0))
   DiskName$ = MID$(DiskList$, SFind%, Find - SFind%)
   PRINT i, DiskName$ + ":"
   SFind% = Find + 1
NEXT i
ankey$ = INPUT$(1)
'显示当前路径
PRINT CurrentPath$
'显示当前路径中所有目录
GetDirList DirList$, DirNum%
SFind% = 1
FOR i = 1 TO DirNum%
   Find = INSTR(SFind%, DirList$, CHR$(0))
   DirName$ = MID$(DirList$, SFind%, Find - SFind%)
   PRINT i, DirName$
   SFind% = Find + 1
NEXT i
ankey$ = INPUT$(1)
'显示当前目录中的所有文件
GetFileList "*.*", &HFF, FileList$, FileNum%
SFind% = 1
FOR i = 1 TO FileNum%
   Find = INSTR(SFind%, FileList$, CHR$(0))
   F1$ = MID$(FileList$, SFind%, Find - SFind%)
   PRINT i, F1$
   SFind% = Find + 1
NEXT i

'Changes current drive.
FUNCTION ChangeDrive% (Drive$)
  '本函数的功能:切换盘付,Drive$为要转换的盘符
  '本函数使用方法举例: 如果要转换到E盘
  '程序:IF ChangeDrive% ("E:")=0 THEN  PRINT "成功转换到了E盘" ELSE PRINT "没有转换到E盘"
  '改变盘符的中断资料:入口AH=0E DL=要转换的盘付(0A,1B..(
  DIM Reg%(9)
  Drive$ = UCASE$(Drive$)
  Reg%(0) = &HE00
  Reg%(3) = ASC(Drive$) - 65
  CALL INT86XOLD(&H21, Reg%(), Reg%())
  ChangeDrive% = Reg%(7) AND 1
END FUNCTION

FUNCTION ChangePath% (Path$)
  '本函数的功能:切换目录,Path$为要切换的目录
  '本函数使用方法举例 :  如果要转换到目录QBASIC下
  '程序:IF ChangePath% ("QBASIC")=0 THEN  PRINT "成功转换到了目录" ELSE PRINT "没有转换到目录"
  '改变目录的中断资料:入口AH=3B DS:DX=要转换的目录
  DIM Reg%(9)
  Path$ = Path$ + CHR$(0)
  Reg%(8) = VARSEG(Path$)
  Reg%(3) = SADD(Path$)
  Reg%(0) = &H3B00
  CALL INT86XOLD(&H21, Reg%(), Reg%())
  ChangePath% = Reg%(7) AND 1
END FUNCTION

SUB CloseFile (FileHandle%)
  '本函数的功能:关闭文件 ,FileHandle%为要关闭的文件号
  '本函数使用方法举例 :  如果要关闭5号文件(操作系统用文件号来管理打开,读写文件)
  '程序: CloseFile 5
  '关闭文件的中断资料:入口AH=3E BX=要关闭的文件号
  DIM Reg%(9)
  Reg%(1) = FileHandle%
  Reg%(0) = &H3E00
  CALL INT86XOLD(&H21, Reg%(), Reg%())
END SUB

SUB CreateDir (DirName$)
  '本函数的功能:建立一个目录,DirName$为要建的目录名
  '本函数使用方法举例 :  如果要建立一个目录TEST
  '程序:CreateDir "test"
  '建立目录的中断资料:入口AH=39 DS:DX=要建立的目录名
  DirName$ = DirName$ + CHR$(0)
  DIM Reg%(9)
  Reg%(8) = VARSEG(DirName$)
  Reg%(3) = SADD(DirName$)
  Reg%(0) = &H3900
  CALL INT86XOLD(&H21, Reg%(), Reg%())
END SUB


FUNCTION CurrentDrive$
  '本函数的功能:获得当前盘符
  '本函数使用方法举例 : 如果要知道当前盘符
  '程序:PRINT "当前盘符- ";CurrentDrive$
  '获得当前目录的中断资料:入口AH=19 返回:AL=0A,1B...
  DIM Reg%(9)
  Drive$ = UCASE$(Drive$)
  Reg%(0) = &H1900
  CALL INT86XOLD(&H21, Reg%(), Reg%())
  CurrentDrive$ = CHR$(65 + (Reg%(0) AND &HFF)) + ":\"
END FUNCTION

FUNCTION CurrentPath$
  '本函数的功能:获得当前盘符的当前路径
  '本函数使用方法举例 : 如果要知道当前盘符的路径
  '程序:PRINT "当前盘符的目录为- ";CurrentPath$
  '获得当前路径的中断资料:入口AH=47 DL=0A,1B... 返回DS:SI地址=路径字符串
  DIM PathSize AS STRING * 64
  DIM Reg%(9)
  Reg%(0) = &H4700
  Reg%(3) = ASC(CurrentDrive$) - 64
  Reg%(8) = VARSEG(PathSize)
  Reg%(5) = VARPTR(PathSize)
  CALL INT86XOLD(&H21, Reg%(), Reg%())
  CurrentPath$ = LEFT$(PathSize, INSTR(PathSize, CHR$(0)) - 1)
END FUNCTION

FUNCTION Deldir% (DirName$)
  '本函数的功能:删除目录,DirName$为要删除的目录名
  '本函数使用方法举例 : 如果删除成功,返回函数的直为0
  '程序:IF Deldir% ("TEST")=0 THEN PRINT "成功删除目录"
  '删除目录的中断资料:入口AH=3A DS:DX地址=路径字符串
  DirName$ = DirName$ + CHR$(0)
  DIM Reg%(9)
  Reg%(8) = VARSEG(DirName$)
  Reg%(3) = SADD(DirName$)
  Reg%(0) = &H3A00
  CALL INT86XOLD(&H21, Reg%(), Reg%())
  Deldir% = Reg%(7) AND 1
END FUNCTION


FUNCTION FindDrives% (Drive$)
  '本函数的功能:查找盘符,Drive$为要查找的盘符
  '本函数使用方法举例 : 如果要知道系统中有无A盘
  '程序:IF FindDrives% ("A:")=0 THEN PRINT "有A盘" ELSE print "无A盘"
  Drive$ = UCASE$(Drive$)
  DIM Reg%(9)
  Reg%(0) = &H440E
  Reg%(1) = ASC(Drive$) - 64
  CALL INT86XOLD(&H21, Reg%(), Reg%())
  FindDrives% = -1
  IF (Reg%(7) AND 1) = 0 THEN FindDrives% = Reg%(0)
END FUNCTION

FUNCTION FindFirstFile% (FileName$, FileAttrib%)
  '查找第一个文件:入口AH=4E CX=属性 DS:DX=文件名 返回AX=错误码
  SetFileDta
  FileName$ = FileName$ + CHR$(0)
  DIM Reg%(9)
  Reg%(0) = &H4E00
  Reg%(8) = VARSEG(FileName$)
  Reg%(3) = SADD(FileName$)
  Reg%(2) = FileAttrib%
  CALL INT86XOLD(&H21, Reg%(), Reg%())
  FindFirstFile% = Reg%(7) AND 1
END FUNCTION

FUNCTION FindNextFile%
  '查找成功根据调用查找下一个文件 入口AH=4F  DS:DX=文件名,返回AX=错误码
  DIM Reg%(9)
  Reg%(0) = &H4F00
  CALL INT86XOLD(&H21, Reg%(), Reg%())
  FindNextFile% = Reg%(7) AND 1
END FUNCTION

SUB GetDirList (DirList$, DirNum%)
  '本函数的功能:获得当前路径下的所有目录 DirList$为目录列表,每个目录名用CHR$(0)隔开, DirNum%为目录的数量
  '本函数使用方法举例 : 如果要知道当前路径下的所有目录
  '程序:GetDirList DirList$, DirNum% :PRINT "目录数量为- ";dirnum%,dirlist$

DirList$ = ""
FileName$ = "*.*"
FileAttrib% = &HFF
IF FindFirstFile%(FileName$, FileAttrib%) = 1 THEN EXIT SUB
DO WHILE FindNextFile% = 0
     Find% = INSTR(31, FileDta$, CHR$(0)) - 30
     FileName$ = MID$(FileDta$, 31, Find%)
     FileAttrib% = CVI((MID$(FileDta$, 21, 2)))
     IF FileAttrib% = 4096 THEN
        DirList$ = DirList$ + FileName$
        i% = i% + 1
     END IF
LOOP
DirNum% = i%
END SUB

SUB GetDiskList (DiskList$, DiskNum%)
'本函数的功能:获得系统中所有盘符 DiskList$为磁盘列表,每个用CHR$(0)隔开, DiskNum%为目录的数量
  '本函数使用方法举例 : 如果要知道所有盘符
  '程序: GetDiskList DiskList$, DiskNum% :PRINT "磁盘数量为- ";disknum%,disklist$
DiskList$ = ""
FOR i = 1 TO 26
  IF FindDrives%(CHR$(i + 64)) = 0 THEN
     DiskList$ = DiskList$ + CHR$(i + 64)
     DiskList$ = DiskList$ + CHR$(0)
     i1% = i1% + 1
  END IF
NEXT i
DiskNum% = i1%
END SUB

FUNCTION RenFile% (OldFile$, NewFile$)
  '本函数的功能:文件改名 ,OldFile$为要改名的文件 NewFile$为新文件名
  '本函数使用方法举例 :  如果要把TEST.TXT改名为DEMO.BAK
  '程序: IF RenFile% ("TEST.TXT", "DEMO.BAK")=0 THEN PRINT "文件改名成功"
  '文件改名的中断资料:入口AH=56 DS:DX=旧文件地址 ES:DI=新
  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

SUB SetFileDta
  '设置DTA:入口AH=1A DX:DX=缓冲区(32)
  FileDta$ = STRING$(43, CHR$(0))
  DIM Reg%(9)
  Reg%(0) = &H1A00
  Reg%(8) = VARSEG(FileDta$)
  Reg%(3) = SADD(FileDta$)
  CALL INT86XOLD(&H21, Reg%(), Reg%())
END SUB


SUB GetFileList (FileName$, FileAttrib%, FileList$, FileNum%)
  '本函数的功能:获得当前路径下的所有文件 FILEList$为文件列表,每个文件名用CHR$(0)隔开, fileNum%为文件的数量
  '本函数使用方法举例 : 如果要知道当前路径下的所有文件
  '程序:GetFileList FileName$, FileAttrib%, FileList$, FileNum%:PRINT "文件数量为- ";filenum%,filelist$

FileList$ = ""
IF FileName$ = "" THEN FileName$ = "*.*"
IF FileAttrib% = 0 THEN FileAttrib% = &HFF
IF FindFirstFile%(FileName$, FileAttrib%) = 1 THEN EXIT SUB
i% = 0
DO
     Find% = INSTR(31, FileDta$, CHR$(0)) - 31
     FileName$ = MID$(FileDta$, 31, Find% + 1)
     FileAttrib% = CVI((MID$(FileDta$, 21, 2)))
     IF FileAttrib% <> 4096 THEN
        FileList$ = FileList$ + FileName$
        i% = i% + 1
     END IF
LOOP WHILE FindNextFile% = 0
FileNum% = i%
'-----un file name
'SFind% = 1
'FOR i = 1 TO FileNum%
'   Find = INSTR(SFind%, FileList$, CHR$(0))
'   F1$ = MID$(FileList$, SFind%, Find - SFind%)
'   PRINT i, F1$
'   SFind% = Find + 1
'NEXT i
END SUB

FUNCTION DelFile% (FileHandle%)
  'ax% = 0: bx% = 1: cx% = 2: dx% = 3: bp% = 4
  'si% = 5: di% = 6: flags% = 7: ds% = 8: es% = 9
  DIM Reg%(9)
  Reg%(1) = FileHandle%
  Reg%(0) = &H4100
  CALL INT86XOLD(&H21, Reg%(), Reg%())
  DleFile% = Reg%(7) AND 1
END FUNCTION
FUNCTION CreateFile% (FileName$)
  'ax% = 0: bx% = 1: cx% = 2: dx% = 3: bp% = 4
  'si% = 5: di% = 6: flags% = 7: ds% = 8: es% = 9
  FileName$ = FileName$ + CHR$(0)
  DIM Reg%(9)
  Reg%(8) = VARSEG(FileName$)
  Reg%(3) = SADD(FileName$)
  Reg%(0) = &H3C00
  Reg%(2) = 0
  CALL INT86XOLD(&H21, Reg%(), Reg%())
  CreateFile% = -1
  IF (Reg%(7) AND 1) = 0 THEN CreateFile% = Reg%(0)
END FUNCTION


SUB FileInfo (File AS FileRecord)
Find% = INSTR(31, FileDta$, CHR$(0)) - 31
File.DosName$ = MID$(FileDta$, 31, Find% + 1)
File.size = CVL(MID$(FileDta$, &H1B, 4))
FileDate% = CVI(MID$(FileDta$, &H19, 2))
FileTime% = CVI(MID$(FileDta$, &H17, 2))
File.Attrib = ASC(MID$(FileDta$, &H16, 1))
File.hour% = (FileTime% AND &HF800) \ &H800 AND &H1F
File.min% = (FileTime% AND &HFFE0) \ &H20 AND &H3F
File.sec% = FileTime% AND &H1F
File.Day% = FileDate% AND &H1F
File.Month% = (FileDate% \ &H20) AND &HF
File.Year% = FileDate% \ &H200 + 1980
END SUB


FUNCTION MovePosition% (FileHandle%, MoveMode%, MoveNum)
  'ax% = 0: bx% = 1: cx% = 2: dx% = 3: bp% = 4
  'si% = 5: di% = 6: flags% = 7: ds% = 8: es% = 9
  DIM t1 AS STRING * 2, t2 AS STRING * 2
  t1 = LEFT$(MKL$(MoveNum), 2)
  t2 = RIGHT$(MKL$(MoveNum), 2)
  DIM Reg%(9)
  Reg%(2) = CVI(t2)
  Reg%(3) = CVI(t1)
  Reg%(1) = FileHandle%
  Reg%(0) = &H4200 OR MoveMode%
  CALL INT86XOLD(&H21, Reg%(), Reg%())
  t2 = MKI$(Reg%(3))
  t1 = MKI$(Reg%(0))
  MoveNum = CVL(t1 + t2)
END FUNCTION

FUNCTION OpenFile% (FileName$, Mode%, FileHandle%)
  FileName$ = FileName$ + CHR$(0)
  DIM Reg%(9)
  Reg%(8) = VARSEG(FileName$)
  Reg%(3) = SADD(FileName$)
  Reg%(0) = &H3D00 OR Mode%
  CALL INT86XOLD(&H21, Reg%(), Reg%())
  FileHandle% = Reg%(0)
  OpenFile% = Reg%(7) AND 1
END FUNCTION

FUNCTION ReadFile% (FileBuff$, ReadLen%, FileHandle%)
  DIM Reg%(9)
  IF FileBuff$ = "" THEN FileBuff$ = SPACE$(ReadLen%)
  Reg%(8) = VARSEG(FileBuff$)
  Reg%(3) = SADD(FileBuff$)
  Reg%(0) = &H3F00
  Reg%(1) = FileHandle%
  Reg%(2) = ReadLen%
  CALL INT86XOLD(&H21, Reg%(), Reg%())
  ReadFile% = Reg%(7) AND 1
  ReadLen% = Reg%(0)
END FUNCTION


FUNCTION WriteFile% (buff$, WriteLen%, FileHandle%)
  ax% = 0: Bx% = 1: Cx% = 2: Dx% = 3: bp% = 4
  Si% = 5: di% = 6: Flags% = 7: Ds% = 8: es% = 9
  DIM Reg%(9)
  Reg%(Ds%) = VARSEG(buff$)
  Reg%(Dx%) = SADD(buff$)
  Reg%(Bx%) = FileHandle%
  Reg%(Cx%) = WriteLen%
  Reg%(ax%) = &H4000
  CALL INT86XOLD(&H21, Reg%(), Reg%())
  WriteFile% = Reg%(Flags%) AND 1
  WriteLen% = Reg%(Cx%)
END FUNCTION

回复列表 (共3个回复)

沙发

顶!

板凳

DECLARE SUB SortFileName (f$, a%)
DECLARE SUB QuickSort (l%, h%)
m% = 5000
CLS
FOR i% = 1 TO m%
   k$ = k$ + LTRIM$(STR$(m% - i%)) + CHR$(0)
NEXT
i%=i%-1

DIM arrfilesp%(i%)
SortFileName k$, i%

x% = 1
y% = 1
COLOR 23, 0
CLS
FOR j% = 1 TO i%

e$ = MID$(k$, arrfilesp%(j%), 13) + CHR$(0)
e$ = LEFT$(e$, INSTR(1, e$, CHR$(0)) - 1)

x% = x% + 1
IF x% > 24 THEN
    IF y% > 64 THEN
       LOCATE 25, 1
       COLOR 14
       PRINT "  ------------- Press Any Key to Continue -----------------  ";
       IF INPUT$(1) = CHR$(27) THEN EXIT FOR
       COLOR 23, 0
       CLS
       x% = 1
       y% = 1
    ELSE
       x% = 1
       y% = y% + 16
    END IF
END IF
LOCATE x%, y%
PRINT e$;
NEXT

DEFINT A-Z
SUB QuickSort (l, h)
SHARED filenamechr$,arrfilesp%()
IF l < h THEN
   IF h - l = 1 THEN
      IF MID$(filenamechr$, arrfilesp%(l), 12) > MID$(filenamechr$, arrfilesp%(h), 12) THEN SWAP arrfilesp%(l), arrfilesp%(h)
   ELSE
      r = RND * (h - l + 1) + l
      SWAP arrfilesp%(h), arrfilesp%(r)
      p$ = MID$(filenamechr$, arrfilesp%(h), 12)
      i = l
      j = h
         DO
            DO WHILE (i < j) AND (MID$(filenamechr$, arrfilesp%(i), 12) <= p$)
                 i = i + 1
            LOOP
            DO WHILE (j > i) AND (MID$(filenamechr$, arrfilesp%(j), 12) >= p$)
                 j = j - 1
            LOOP
            IF i < j THEN SWAP arrfilesp%(i), arrfilesp%(j)
         LOOP WHILE i < j
         SWAP arrfilesp%(i), arrfilesp%(h)
         IF (i - l) < (h - i) THEN
            QuickSort l, i - 1
            QuickSort i + 1, h
         ELSE
            QuickSort i + 1, h
            QuickSort l, i - 1
         END IF
   END IF
END IF
END SUB

SUB SortFileName (f$, a%)
SHARED filenamechr$,arrfilesp%()
filenamechr$ = f$
arrfilesp%(1) = 1

FOR i% = 2 TO a%
   arrfilesp%(i%) = INSTR(arrfilesp%(i% - 1) + 1, filenamechr$, CHR$(0)) + 1
NEXT

QuickSort 1, a%
END SUB


你看情况修改吧,上面只是按文件名字排序的

3 楼

我顶

秋水这几天到哪去了?
星期一也该回来了吧?

我来回复

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