Dir
 
在文件系统中搜索并返回有关项目的信息;执行目录搜索

语法

# Include "dir.bi"

Declare Function Dir Overload ( ByRef item_spec As Const String, ByVal attrib_mask As Integer = fbNormal, ByRef out_attrib As Integer ) As String
Declare Function Dir ( ByRef item_spec As Const String, ByVal attrib_mask As Integer = fbNormal, ByVal p_out_attrib As Integer Ptr = 0 ) As String
Declare Function Dir ( ByVal attrib_mask As Integer = fbNormal, ByRef out_attrib As Integer ) As String
Declare Function Dir ( ByVal attrib_mask As Integer = fbNormal, ByVal p_out_attrib As Integer Ptr = 0 ) As String

用法

result = Dir( item_spec , [ attrib_mask ], out_attrib ] )
result = Dir( item_spec [, [ attrib_mask ] [, p_out_attrib ] ] )
result = Dir( out_attrib )
result = Dir( [ p_out_attrib ] )

参数

item_spec
匹配项目名称的模式。
attrib_mask
匹配项目属性的位掩码。
out_attrib
引用一个位掩码,赋值每个找到的项的属性(如果有的话)。
p_out_attrib
指向赋值每个找到的项目属性的位掩码(如果有的话)。

返回值

如果没有匹配名称item_spec 或属性掩码attrib_mask 的项目,则out_attrib (或*p_out_attrib )被赋值为零,并返回一个空字符串。否则,out_attrib (或*p_out_attrib )被赋予项目的属性掩码,并且返回没有路径的项目名称。

说明

如果item_spec 包含绝对路径,则第一个过程会在文件系统中搜索与item_spec 名称匹配的项目,其属性全部包含在attrib_mask 中。否则,它将搜索当前目录(参见CurDir)。在任何情况下,如果未找到匹配的项目,则将out_attrib 赋值给零,并返回一个空字符串。否则,将为out_attrib 赋值项目的属性标志,并返回没有路径的项目的名称。

item_spec 可能包括一个星号(*,用于匹配任何相邻字符)或一个或多个问号(?,用于匹配任何单个字符)。如果是,则该过程将搜索第一个此类项目。如果找到,则忽略item_spec 的后续调用或设置为空字符串,将返回与名称item_spec 匹配的下一个项目,直到找不到更多这样的项目。如果从这些后续调用中省略attrib_mask ,则该过程将搜索具有与上一次调用相同属性的项目。

第二种语法与Dir( item_spec , attrib_mask , *p_out_attrib )相同。
第三种语法与Dir( "", , out_attrib )相同。
第四种语法与Dir( "", , *p_out_attrib )相同。

文件属性:
文件和目录等项目可以说具有所谓的文件属性;描述项目的元数据。此元数据的含义可能因操作系统及其使用的文件系统而异。
以下定义的常量用作attrib_mask out_attrib *p_out_attrib 中的位标志。它们的值可以组合使用操作符 Or形成掩码。这些值是返回的文件允许具有的元数据。例如,fbDirectory将仅允许不设置目录属性,这意味着只有没有设置其他属性的文件或目录才能匹配。(fbReadOnly Or fbDirectory)将允许只读目录和文件以及可写目录和文件。
通过使用操作符 And检查返回的out_attrib 的特定标志,可以实现更强大的过滤。要访问定义的标志,您必须#include "dir.bi".

# define fbReadOnly &h01
The item cannot be written to or deleted.
DOS和Windows:项目具有“只读”属性集。
Linux的:该项目没有与当前用户或组相关联的写入权限,也不是全局可写的。(是否忽略用户具有root用户权限。)

# define fbHidden &h02
The item is hidden in ordinary directory listings.
DOS和Windows:项目具有“隐藏”属性集。
Linux的:项目的名称具有句点(.)作为第一个字符。

# define fbSystem &h04
The item is used almost exclusively by the system.
DOS和Windows:项目的“系统”属性设置。
Linux的:该项目是字符设备,块设备,命名管道(FIFO)或Unix套接字。

# define fbDirectory &h10
The item is a directory. Includes the current (.) and parent (..) directories as well.
DOS和Windows和Linux:该项目是一个目录。

# define fbArchive &h20
The item may be backed up after some automated operations.
DOS和Windows:项目具有“archive”属性集(在对文件进行每次写入访问后自动设置)。
Linux的:项目不是目录;典型的文件系统不支持此元数据。

# define fbNormal (fbReadOnly or fbArchive)
The item is read-only or "archived".

(如果attrib_mask 不包含fbArchive,则Dir可能会扩大支票以包含fbDirectory,但建议添加fbDirectory,如果这是所寻求的行为。)

找不到任何属性的项目总是匹配,无论attrib_mask 的值如何。如果一个项目在attrib_mask 中没有指定一个或多个属性,则该项目将不匹配。例如,fbArchive Or fbDirectory 将与归档文件,归档目录,非归档文件和非归档目录匹配。它不会与例如只读文件匹配。

一般来说,不可能使用attrib_mask 在包含具有一组属性的文件/文件夹中包含不同集合的文件/文件夹。例如,不排除只读文件扫描只读目录(除非文件还有其他属性)。通过检查所需属性集合的out_attrib 值可以获得更精确的控制。


例子

#include "dir.bi" 'provides constants to use for the attrib_mask parameter

Sub list_files (ByRef filespec As String, ByVal attrib As Integer)
    Dim As String filename = Dir(filespec, attrib) '使用指定的filespec / attrib启动文件搜索* AND *获取第一个文件名。
    Do While Len(filename) > 0 '如果len(filename)为0,则退出循环:不再有文件名被读取。
        Print filename
        filename = Dir()
    Loop
End Sub

Print "目录:"
list_files "*", fbDirectory

Print
Print "归档文件:"
list_files "*", fbArchive


例子

''使用DIR功能和检索属性的示例

#include "dir.bi" '' provides constants to match the attributes against

''设置输入属性掩码以允许正常,隐藏,系统或目录的文件
Const attrib_mask = fbNormal Or fbHidden Or fbSystem Or fbDirectory '= &h37

Dim As UInteger out_attr ''无符号整数来保存检索的属性

Dim As String fname ''文件/目录名返回
Dim As Integer filecount, dircount

fname = Dir("*.*", attrib_mask, out_attr) ''根据提供的文件规范和属性掩码获取第一个文件名/属性

Print "文件列表" & CurDir & ":"

Do Until Len(fname) = 0 ''循环直到Dir返回空字符串

    If (fname <> ".") And (fname <> "..") Then ''忽略当前和父目录条目

        Print fname,

        If (out_attr And fbDirectory) <> 0 Then
            Print "- 目录";
            dircount += 1
        Else
            Print " - 文件";
            filecount += 1
        End If
        If (out_attr And fbReadOnly) <> 0 Then Print ", 只读";
        If (out_attr And fbHidden) <> 0 Then Print ",隐藏";
        If (out_attr And fbSystem) <> 0 Then Print ",系统";
        If (out_attr And fbArchive) <> 0 Then Print ",存档";
        Print

    End If

    fname = Dir(out_attr) ''找到下一个名字/属性

Loop

Print
Print "发现" & filecount & "文件和" & dircount & "子目录"


平台差异

  • Linux需要filename 的情况才能匹配文件的真实名称。Windows和DOS不区分大小写。
  • Linux中的路径分隔符是正斜杠/ .Windows使用反斜杠\\ ,但它允许正斜杠。DOS使用反斜杠。
  • 在DOS中,&h37 &h3F 的属性掩码值通常也有效,但&h37 更安全)返回所有文件和目录,包括“”。和“..”,但没有卷:值8 返回卷,即使当前目录不是主目录。

方言差异

  • -lang qb 方言中不可用,除非使用别名__Dir引用。

与QB差别

  • 在QBasic中找不到但在Visual Basic中存在。out_attrib 参数是FreeBASIC的新功能。

参考