用VBScript读取txt文件时,为什么要用Const conForReading?
When reading a txt file with VBScript, why do we use Const conForReading?
我注意到其他人在其他代码中使用 ForReading 而不是 conForReading,但我试过了,但它们似乎不能互换。这两者有什么区别?我是 VBScript 的新手,很抱歉这是一个明显的问题。我在下面使用它:
Option Explicit
Const conForReading = 1;
'Declare variables
Dim objFSO, objReadFile, contents
'Set Objects
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objReadFile = objFSO.OpenTextFile("C:\Users\ali\Desktop\Tests\ToRead.txt",1, False)
非常感谢您的澄清,谢谢。
常量提供了一种使用特定值(而不是它们的字面值)的便捷方式,而无需实际记住值本身。使用常量还可以使您的代码更具可读性和可维护性。
一些常量已经在VBScript
中定义,您不需要在代码中显式声明它们。只需使用它们代替它们所代表的值。以下是 VBScript 中提供的各种常量类别以及对每种常量的简要说明(带示例):
- Color 常量:可用于脚本的八种基本颜色(例如
vbRed
、vbCyan
、...)。
- 比较常量:用于比较字符串(
vbBinaryCompare
,vbTextCompare
).
- 日期和时间 常量:由各种日期和时间函数使用(
vbFriday
,...)。
- 日期格式 常量:用于格式化日期和时间(
vbLongDate
、vbShortTime
、...)。
- MsgBox 常量:在 MsgBox 函数中用于描述按钮可见性、标签、行为和 return 值(
vbOKOnly
、vbOK
, ...).
- String 常量:字符串操作中使用的各种不可打印字符(
vbTab
、vbNewLine
、...)。
- Tristate 常量:与格式化数字的函数一起使用。
- VarType 常量:各种 Variant 子类型(
vbNull
、vbDate
、...)。
- 杂项 不适合归入任何其他类别的常量 (
vbObjectError
)。
遗憾的是,VBScript
不使用枚举常量(即 typedef enum BrowserNavConstants
中的预定义数据结构,例如 navOpenInNewWindow
、navOpenInNewTab
、...):您必须或者(更好)在您的代码中明确定义它们:
Const navOpenInNewWindow=&h01, navOpenInNewTab=&h0800
或(更糟)使用数字文字值(&h01
、&h0800
、...)代替常量名称...
最终,您可以定义自己的常量,随意命名:
'various useful constants
Const ForReading = 1, ForWriting = 2, ForAppending = 8
Const OpenAsDefault = -2 ' Opens the file using the system default.
Const OpenAsUnicode = -1 ' Opens the file as Unicode.
Const OpenAsUSAscii = 0 ' Opens the file as ASCII.
Const DontCreate = False ' do not create a new file if doesn't exist
Const CreateFile = True ' create a new file if the specified filename doesn't exist
Const RabbitEars = """"
'Registry Data Types and Corresponding Values'
Const _
REG_NONE = 0 , _
REG_SZ = 1 , _
REG_EXPAND_SZ = 2 , _
REG_BINARY = 3 , _
REG_DWORD = 4 , _
REG_MULTI_SZ = 7
'Registry Subtrees and Corresponding Hexadecimal Values'
Const _
HKEY_CLASSES_ROOT = &H80000000 , _
HKEY_CURRENT_USER = &H80000001 , _
HKEY_LOCAL_MACHINE = &H80000002 , _
HKEY_USERS = &H80000003 , _
HKEY_CURRENT_CONFIG = &H80000005 , _
HKEY_DYN_DATA = &H80000006
'Abbreviated names for Registry Subtrees
Const HKCR = &H80000000 'HKEY_CLASSES_ROOT
Const HKCU = &H80000001 'HKEY_CURRENT_USER
Const HKLM = &H80000002 'HKEY_LOCAL_MACHINE
Const HKUS = &H80000003 'HKEY_USERS
Const HKCC = &H80000005 'HKEY_CURRENT_CONFIG
Const HKDD = &H80000006 'HKEY_DYN_DATA
OpenTextFile 方法支持多种修饰符来实现不同的目标。
第二个参数 "iomode" 指定是否应该读取、覆盖或追加文件。
由于 vbscript 中没有枚举类型,因此通过整数来区分。
如您所见 in the documentation of the function.
1 means read
2 means write
8 means append
虽然从程序的角度来看,将 1,2 和 8 写为参数完全没问题,但这对人类来说有点问题。如果您阅读其他人的代码(或者稍后阅读您自己的代码),您只会看到
... OpenTextFile( "....", 1, ...)
你可能真的不知道 1 在那里意味着什么。所以人们认为为名为 ForReading 的变量定义一个变量是个好主意,它只会使代码更易于理解。如果你这样做,你可以写:
... OpenTextFile( "....", ForReading, ...)
并立即知道发生了什么,尽管解释器的代码保持不变。
现在正如 JosefZ 指出的那样,已经有一些预定义的常量,但是这 3 个不在其中。因为你自己定义它们(你也可以在我链接的 msdn 页面的例子中看到)
之所以使用常量而不是变量,是为了防止在意外更改常量值时出现编程错误。 "ForReading" 不为 1 是没有意义的,因此,作为常量,如果您尝试更改该值,脚本引擎会警告您。
现在有些人按照所有常量都以 "con" 开头的约定来标记他们的常量,这样他们就可以在代码中轻松识别它们。
这基本上就是有ForReading和conForReading的原因。然而,它是一样的。你可以随心所欲地调用它,重要的是它的值为 1 并且你使用你定义的那个。如果您在脚本中定义了 conForReading,则不能在函数调用中使用 ForReading。
其他人也总是定义这3个常量
Const ForReading = 1, ForWriting = 2, ForAppending = 3
哪怕只用一个。这可能会让初学者感到困惑,因为即使不调用它们,看起来也需要这些常量。他们这样做的原因可能是因为他们要么只是从一些示例或另一个程序中复制代码,要么是为了完整性,以便很好地记录函数中可能使用的内容。另一个原因可能是,在更大的脚本中,您可能无论如何都需要所有这些,如果您在开始时包含它们,您就永远不会犯使用一个而不定义它的错误。
至于您的示例代码:
您在函数调用中根本没有使用常量,因此如果您将其省略,它甚至不会改变任何东西。
我注意到其他人在其他代码中使用 ForReading 而不是 conForReading,但我试过了,但它们似乎不能互换。这两者有什么区别?我是 VBScript 的新手,很抱歉这是一个明显的问题。我在下面使用它:
Option Explicit
Const conForReading = 1;
'Declare variables
Dim objFSO, objReadFile, contents
'Set Objects
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objReadFile = objFSO.OpenTextFile("C:\Users\ali\Desktop\Tests\ToRead.txt",1, False)
非常感谢您的澄清,谢谢。
常量提供了一种使用特定值(而不是它们的字面值)的便捷方式,而无需实际记住值本身。使用常量还可以使您的代码更具可读性和可维护性。
一些常量已经在VBScript
中定义,您不需要在代码中显式声明它们。只需使用它们代替它们所代表的值。以下是 VBScript 中提供的各种常量类别以及对每种常量的简要说明(带示例):
- Color 常量:可用于脚本的八种基本颜色(例如
vbRed
、vbCyan
、...)。 - 比较常量:用于比较字符串(
vbBinaryCompare
,vbTextCompare
). - 日期和时间 常量:由各种日期和时间函数使用(
vbFriday
,...)。 - 日期格式 常量:用于格式化日期和时间(
vbLongDate
、vbShortTime
、...)。 - MsgBox 常量:在 MsgBox 函数中用于描述按钮可见性、标签、行为和 return 值(
vbOKOnly
、vbOK
, ...). - String 常量:字符串操作中使用的各种不可打印字符(
vbTab
、vbNewLine
、...)。 - Tristate 常量:与格式化数字的函数一起使用。
- VarType 常量:各种 Variant 子类型(
vbNull
、vbDate
、...)。 - 杂项 不适合归入任何其他类别的常量 (
vbObjectError
)。
遗憾的是,VBScript
不使用枚举常量(即 typedef enum BrowserNavConstants
中的预定义数据结构,例如 navOpenInNewWindow
、navOpenInNewTab
、...):您必须或者(更好)在您的代码中明确定义它们:
Const navOpenInNewWindow=&h01, navOpenInNewTab=&h0800
或(更糟)使用数字文字值(&h01
、&h0800
、...)代替常量名称...
最终,您可以定义自己的常量,随意命名:
'various useful constants
Const ForReading = 1, ForWriting = 2, ForAppending = 8
Const OpenAsDefault = -2 ' Opens the file using the system default.
Const OpenAsUnicode = -1 ' Opens the file as Unicode.
Const OpenAsUSAscii = 0 ' Opens the file as ASCII.
Const DontCreate = False ' do not create a new file if doesn't exist
Const CreateFile = True ' create a new file if the specified filename doesn't exist
Const RabbitEars = """"
'Registry Data Types and Corresponding Values'
Const _
REG_NONE = 0 , _
REG_SZ = 1 , _
REG_EXPAND_SZ = 2 , _
REG_BINARY = 3 , _
REG_DWORD = 4 , _
REG_MULTI_SZ = 7
'Registry Subtrees and Corresponding Hexadecimal Values'
Const _
HKEY_CLASSES_ROOT = &H80000000 , _
HKEY_CURRENT_USER = &H80000001 , _
HKEY_LOCAL_MACHINE = &H80000002 , _
HKEY_USERS = &H80000003 , _
HKEY_CURRENT_CONFIG = &H80000005 , _
HKEY_DYN_DATA = &H80000006
'Abbreviated names for Registry Subtrees
Const HKCR = &H80000000 'HKEY_CLASSES_ROOT
Const HKCU = &H80000001 'HKEY_CURRENT_USER
Const HKLM = &H80000002 'HKEY_LOCAL_MACHINE
Const HKUS = &H80000003 'HKEY_USERS
Const HKCC = &H80000005 'HKEY_CURRENT_CONFIG
Const HKDD = &H80000006 'HKEY_DYN_DATA
OpenTextFile 方法支持多种修饰符来实现不同的目标。 第二个参数 "iomode" 指定是否应该读取、覆盖或追加文件。 由于 vbscript 中没有枚举类型,因此通过整数来区分。 如您所见 in the documentation of the function.
1 means read
2 means write
8 means append
虽然从程序的角度来看,将 1,2 和 8 写为参数完全没问题,但这对人类来说有点问题。如果您阅读其他人的代码(或者稍后阅读您自己的代码),您只会看到
... OpenTextFile( "....", 1, ...)
你可能真的不知道 1 在那里意味着什么。所以人们认为为名为 ForReading 的变量定义一个变量是个好主意,它只会使代码更易于理解。如果你这样做,你可以写:
... OpenTextFile( "....", ForReading, ...)
并立即知道发生了什么,尽管解释器的代码保持不变。 现在正如 JosefZ 指出的那样,已经有一些预定义的常量,但是这 3 个不在其中。因为你自己定义它们(你也可以在我链接的 msdn 页面的例子中看到)
之所以使用常量而不是变量,是为了防止在意外更改常量值时出现编程错误。 "ForReading" 不为 1 是没有意义的,因此,作为常量,如果您尝试更改该值,脚本引擎会警告您。
现在有些人按照所有常量都以 "con" 开头的约定来标记他们的常量,这样他们就可以在代码中轻松识别它们。
这基本上就是有ForReading和conForReading的原因。然而,它是一样的。你可以随心所欲地调用它,重要的是它的值为 1 并且你使用你定义的那个。如果您在脚本中定义了 conForReading,则不能在函数调用中使用 ForReading。
其他人也总是定义这3个常量
Const ForReading = 1, ForWriting = 2, ForAppending = 3
哪怕只用一个。这可能会让初学者感到困惑,因为即使不调用它们,看起来也需要这些常量。他们这样做的原因可能是因为他们要么只是从一些示例或另一个程序中复制代码,要么是为了完整性,以便很好地记录函数中可能使用的内容。另一个原因可能是,在更大的脚本中,您可能无论如何都需要所有这些,如果您在开始时包含它们,您就永远不会犯使用一个而不定义它的错误。
至于您的示例代码: 您在函数调用中根本没有使用常量,因此如果您将其省略,它甚至不会改变任何东西。