2015-01-13 47 views
0

我注意到其他人使用ForReading而不是其他代碼中的conForReading,但我試過了,他們似乎不可互換。這兩者有什麼區別?我是VBScript的新手,很抱歉,如果這是一個明顯的問題。我正在使用它在以下內容:使用VBScript讀取txt文件時,爲什麼要使用Const conForReading?

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) 

我將不勝感激澄清,謝謝。

回答

1

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 

即使只使用一個。這可能會讓初學者感到困惑,因爲如果它們甚至沒有被調用,那麼這些常量就會被需要。他們這樣做的原因可能是因爲他們要麼複製代碼,要麼從他們的程序的某個例子或另一個程序中複製代碼,要麼爲了完整性,以便記錄可能在函數中使用的內容。另一個原因可能是,在一個更大的腳本中,無論如何你都可能需要所有的腳本,並且如果你在開始時包含它們,你永遠不會犯一個使用它而沒有定義它的錯誤。

至於你的示例代碼: 你在函數調用中根本不使用常量,所以如果你把它忽略掉,它甚至不會改變它。

+0

非常感謝!這真的澄清了我的問題。對於查看這個問題並且正在尋找確切答案的人來說,「有些人通過遵循約定來標記它們的常量,它們全部以」con「開頭,以便他們可以很容易地在代碼中識別它們。 這基本上就是爲什麼有ForReading和conForReading的原因。然而,它是一樣的。你可以調用它,但是你希望重要的是它具有值1,並且你使用了你定義的那個。如果在腳本中定義conForReading,則不能在函數調用中使用ForReading。「 –

1

常量提供了一種便捷的方式來使用特定的值(而不是它們的文字值),而不必實際記住值本身。使用常量還可以使代碼更具可讀性和可維護性。

某些常量已在VBScript中定義,您不需要在代碼中明確聲明它們。只需使用它們代替它們代表的值。下面是在VBScript提供常量的各種類別,並且每個的簡要說明(舉例):

  • 顏色常量:可在腳本中使用(八個基本顏色例如vbRedvbCyan,... )。
  • 比較常量:用於比較字符串(vbBinaryCompare,vbTextCompare)。
  • 日期和時間常數:用於各種日期和時間函數(vbFriday,...)。
  • 日期格式常量:用於格式化日期和時間(vbLongDatevbShortTime,...)。
  • MsgBox常量:用於MsgBox函數來描述按鈕可見性,標籤,行爲和返回值(vbOKOnly,vbOK,...)。
  • 字符串常量:用於字符串操作的各種不可打印字符(vbTab,vbNewLine,...)。
  • Tristate常量:用於格式化數字的函數。
  • VarType常量:各種變體子類型(vbNull,vbDate,...)。
  • 雜項常規不適合其他類別(vbObjectError)。

遺憾的是,VBScript不(在typedef enum BrowserNavConstants即預先定義的數據結構,例如像navOpenInNewWindownavOpenInNewTab,...)用枚舉常量:你必須(更好)明確在代碼中定義他們:

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