、利用FileSystemObject對象來處理文件
FileSystemObject對象模型,是微軟提供的專門用來訪問計算機文件系統(tǒng)的,具有大量的屬性、方法和事件。其使用面向對象的“object.method”語法來處理文件夾和文件,使用起來十分方便(需Office 2000以后版本)。FileSystemObject并不是VBA的一部分,它是以一個COM組件的形式提供的。因此,要使用先要創(chuàng)建FileSystemObject對象。
FileSystemObject對象模型包含了下面的對象和集合:
?FileSystemObject 主對象,包含用來創(chuàng)建、刪除和獲得有關信息,以及用來操作驅動器、文件夾和文件的方法和屬性。
?Drive 對象,包含用來獲得信息的方法和屬性,這些信息是關于連接在系統(tǒng)上的驅動器的,如有多少可用空間等。驅動器不一定是硬盤,也可以是CD-ROM、U盤甚至是通過網(wǎng)絡在邏輯上連接的硬盤(如公司里部門共享的服務器網(wǎng)絡硬盤)。
?Drives 集合,提供驅動器的列表,這些驅動器以實物或在邏輯上與系統(tǒng)相連接。Drives集合包括所有驅動器,與類型無關。
?File 對象,包含用來創(chuàng)建、刪除或移動文件的方法和屬性。
?Files 集合,提供包含在文件夾內(nèi)的所有文件的列表。
?Folder 對象,包含用來創(chuàng)建、刪除或移動文件夾的方法和屬性。
?Folders 集合,提供包含在文件夾內(nèi)的所有文件夾的列表。
?TextStream 對象,用來讀寫文本文件。
(一)準備工作
要使用FileSystemObject對象,先要創(chuàng)建它。創(chuàng)建FileSystemObject對象要使用CreatObject函數(shù)。CreateObject 函數(shù)用來創(chuàng)建并返回一個對 ActiveX 對象的引用。
語法:CreateObject(class,[servername])
class 是要創(chuàng)建的應用程序名稱和類。
servername 要在其上創(chuàng)建對象的網(wǎng)絡服務器名稱。(如果要在遠程計算機上創(chuàng)建對象才用)
class 參數(shù)使用 appname.objecttype 這種語法,包括以下部分:
appname 必需的;提供該對象的應用程序名。
objecttype 必需的;待創(chuàng)建對象的類型或類。
因此,我們用下面的代碼創(chuàng)建FileSystemObject對象:
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Scripting是類型庫的名稱,F(xiàn)ileSystemObject就是要創(chuàng)建的對象的名字。
同樣我們可以創(chuàng)建Dictionary 對象如下:
Dim d
Set d = CreateObject("Scripting.Dictionary")
(二)FileSystemObject對象的方法
FileSystemObject對象模型中有些功能是重復的,如可用FileSystemObject對象的CpoyFile方法,也可用File對象的Copy方法來復制文件。下面先介紹FileSystemObject對象的方法。
1、GetDrive 方法
語法:object.GetDrive drivespec
drivespec參數(shù)可以是一個驅動器字符(c)、一個驅動器字符加一個冒號(c:)、一個驅動器字符加冒號和路徑分隔符(c:\)或任何網(wǎng)絡共享的說明(\computer2\share1)。
作用:返回一個與指定路徑中的驅動器相對應的 Drive 對象。
示例:
Dim d
Set d = fso.GetDrive("D:") '變量d就代表了驅動器D對象
如果 drivespec 不符合任何一種可以接受的形式或者不存在,則發(fā)生一個錯誤。
注意:為簡潔,示例中都假定fso是已經(jīng)創(chuàng)建的FileSystemObject對象
2、GetDriveName 方法
語法:object.GetDriveName(path)
作用:返回一個包含指定路徑的驅動器名字的字符串。
示例:
Debug.Print fso.GetDriveName("c:\test.txt") '立即窗口顯示"c:"
3、GetExtensionName 方法
語法:object.GetExtensionName(path)
作用:返回一個包含路徑中最后部件擴展名的字符串。
示例:
Debug.Print fso.GetExtensionName("c:\test.txt") '立即窗口顯示"txt"
4、GetBaseName 方法
語法:object.GetBaseName(path)
作用:返回一個包含路徑中最后部件的基本名字(去掉任何文件擴展名)的字符串。
示例:
Debug.Print fso.GetBaseName("c:\abc\test.txt") '立即窗口顯示"test"
5、GetAbsolutePathName 方法
語法:object.GetAbsolutePathName(pathspec)
作用:從提供的路徑說明中返回一個完整、明確的路徑。
示例:
如果pathspec為空字符串"",則返回當前路徑。假設當前路徑為C:\Documents and Settings\yc\My Documents
Debug.Print fs.GetAbsolutePathName("") '顯示C:\Documents and Settings\yc\My Documents
Debug.Print fs.GetAbsolutePathName("c:..") '顯示C:\Documents and Settings\yc,即上層目錄
Debug.Print fs.GetAbsolutePathName("abc") '顯示C:\Documents and Settings\yc\My Documents\abc
Debug.Print fs.GetAbsolutePathName("c:\test.txt") '顯示C:\test.txt
6、GetFile 方法
語法:object.GetFile(filespec)
作用:返回一個和指定路徑中文件相對應的 File 對象。
示例:
Dim f
Set f = fso.GetFile("c:\test.txt") '變量f就代表了文件test.txt對象
注意:如果指定的文件不存在,則發(fā)生一個錯誤。
7、GetFileName 方法
語法:object.GetFileName(pathspec)
作用:返回指定路徑中的最后部件,該路徑不是驅動器說明的一部分。
示例:
Debug.Print fso.GetFileName("c:\abc\test.txt") '立即窗口顯示"test.txt"
8、GetFolder 方法
語法:object.GetFolder(folderspec)
作用:返回一個和指定路徑中文件夾相對應的 Folder 對象。
示例:
Dim fd
Set fd = fso.GetFolder("c:\windows") '變量f就代表了文件夾windows對象
注意:如果指定的文件夾不存在,則發(fā)生一個錯誤。
9、GetSpecialFolder 方法
語法:object.GetSpecialFolder(folderspec)
作用:返回指定的特殊文件夾。
說明:
folderspec 參數(shù)可為任何的下列值:
WindowsFolder 0 Windows 文件夾,包含由 Windows 操作系統(tǒng)安裝的文件。
SystemFolder 1 系統(tǒng)文件夾,包含庫、字體、設備驅動程序。
TemporaryFolder 2 Temp 文件夾,用于存儲臨時文件。它的路徑在 TMP 環(huán)境變量中。
10、GetParentFolderName 方法
語法:object.GetParentFolderName(path)
作用:返回一個包含指定路徑最后部件父文件夾名字的字符串。
示例:
Debug.Print fso.GetParentFolderName("c:\tmp\test.txt") '顯示"c:\tmp"
11、GetTempName 方法
語法:object.GetTempName
作用:返回一個隨機產(chǎn)生的臨時文件或文件夾的名字,該名字在執(zhí)行需要臨時文件或文件夾的操作時有用。
說明:GetTempName 方法不產(chǎn)生一個文件,它僅提供一個臨時文件名字,該名字可被 CreateTextFile 用于創(chuàng)建一個文件。
示例:
Debug.Print fso.GetTempName '顯示"radB0208.tmp",每次都會變。
12、BuildPath 方法
語法:object.BuildPath(path, name)
作用:追加一個名字到一個已經(jīng)存在的路徑。
示例:
Debug.Print fso.BuildPath("c:\tmp", "abc") '顯示"c:\tmp\abc"
13、CreateFolder 方法
語法:object.CreateFolder(foldername)
作用:創(chuàng)建一個文件夾。
注意:如果指定的文件夾已經(jīng)存在,則發(fā)生一個錯誤。
示例:
fso.CreateFolder("c:\myfolder") '在C盤創(chuàng)建一個myfolder文件夾
14、CopyFolder 方法
語法:object.CopyFolder source, destination[, overwrite]
source 必需的。指明一個或多個被復制文件夾的字符串文件夾說明,可以包括通配符。
destination 必需的。指明 source 中被復制文件夾和子文件夾的接受端的字符串,不允許有通配符。
overwrite 可選的。Boolean 值,它表示已存在的文件夾是否被覆蓋。如果為 True,文件被覆蓋。如果為 False,文件不被覆蓋。缺省值為 True。
作用:復制一個文件夾到另一個地方。
說明:
① 通配符僅可用于 source 參數(shù)的最后一個路徑部件。
例如:fso.CopyFolder "c:\mydocuments\letters\*", "c:\tempfolder\" 這是可以的。
但不能這樣:fso.CopyFolder "c:\mydocuments\*\*", "c:\tempfolder\"
② 如果 source 包含通配符或 destination 以路徑分隔符(\)為結尾,則認為 destination 是一個已存在的文件夾,在其中復制相匹配的文件夾和子文件夾。否則認為 destination 是一個要創(chuàng)建的文件夾的名字。
例如:fso.copyfolder "c:\tmp", "f:\abc\"
如果F盤沒有abc文件夾,將發(fā)生錯誤。如果存在,可看到abc文件夾里有tmp文件夾。
假如寫成這樣:fso.copyfolder "c:\tmp", "f:\abc"
此時若abc不存在,將創(chuàng)建abc文件夾,且將tmp文件夾里的內(nèi)容復制到abc文件夾里,而不是tmp文件夾,只有abc是一個已經(jīng)存在的文件夾時,才復制整個tmp文件夾到abc文件夾里。
③如果 destination 是一個已存在的文件,則發(fā)生一個錯誤。
④如果 destination 是一個目錄,它將嘗試復制文件夾和它所有的內(nèi)容。如果一個包含在 source 的文件已在 destination 中存在,當 overwrite 為 False 時發(fā)生一個錯誤,否則它將嘗試覆蓋這個文件。
⑤如果 destination 是一個只讀目錄,當嘗試去復制一個已存在的只讀文件到此目錄并且 overwrite為 False 時,則發(fā)生一個錯誤。
⑥如果 source 不存在或使用的通配符不能和任何文件夾匹配,也發(fā)生一個錯誤。
⑦CopyFolder 方法停止在它遇到的第一個錯誤上,之前所做的操作是不會消失的,所以要注意。
15、MoveFolder 方法
語法:object.MoveFolder source, destination
參數(shù)與CopyFolder的前兩個一樣。
作用:將一個或多個文件夾從一個地方移動到另一個地方。
說明:
①只有在操作系統(tǒng)支持的情況下,這個方法才允許文件夾在卷之間移動。Windows是不允許的,將C盤的文件夾移到D盤是不行的。
②如果 source 包含通配符或 destination 以路徑分隔符 (\) 為結尾,則認為 destination 指定了一個已存在的文件夾,在此文件夾中移動相匹配的文件。否則,認為 destination 是一個要創(chuàng)建的目標文件夾名字。這點與CopyFolder是一樣的。
③如果 destination 是一個已存在的文件,則發(fā)生一個錯誤。
④如果 destination 是一個目錄,則發(fā)生一個錯誤。
例如:
fso.movefolder "c:\tmp", "c:" '發(fā)生錯誤。
⑤如果 source 不存在或使用的通配符不能和任何文件夾匹配,也發(fā)生一個錯誤。
⑥MoveFolder 方法停止在它遇到的第一個錯誤上。不要嘗試回卷在錯誤發(fā)生前所做的任何改變。
16、DeleteFolder 方法
語法:object.DeleteFolder folderspec[, force]
folderspec 必需的。要刪除的文件夾的名字。 Folderspec 可以在最后的路徑部件中包含通配符。
force 可選的。Boolean 值,如果要刪除具有只讀屬性設置的文件夾,其值為 True,如果值為 False (缺省),則不能刪除具有只讀屬性設置的文件夾。
作用:刪除一個指定的文件夾和它的內(nèi)容。
說明:如果沒有發(fā)現(xiàn)相匹配的文件夾,則發(fā)生一個錯誤。DeleteFolder 方法停止在它遇到的第一個錯誤上,不要嘗試回卷或撤消錯誤發(fā)生前所做的任何改變。
示例:
fso.DeleteFolder("c:\tmp")
17、FolderExists 方法
語法:object.FolderExists(folderspec)
作用:如果指定的文件夾存在返回 True,不存在返回 False。
18、DriveExists 方法
語法:object.DriveExists(drivespec)
作用:如果指定的驅動器存在,返回 True,如果不存在返回 False。
19、FileExists 方法
語法:object.FileExists(filespec)
作用:如果指定的文件存在,返回 True,若不存在,則返回 False。
20、CreateTextFile 方法
語法:object.CreateTextFile(filename[, overwrite[, unicode]])
overwrite 可選的。Boolean 值,表示一個已存在文件是否可被覆蓋。如果可被覆蓋其值為 True,其值為 False 時不能覆蓋。如果它被省略,則已存在文件不能覆蓋。
unicode 可選的。Boolean 值,表示文件是作為一個 Unicode 文件創(chuàng)建的還是作為一個ASCII 文件創(chuàng)建的。如果作為一個 Unicode 文件創(chuàng)建,其值為 True,作為一個 ASCII 文件創(chuàng)建,其值為 False。如果省略的話,則認為是一個 ASCII 文件。
作用:創(chuàng)建一個指定的文件名并且返回一個用于該文件讀寫的 TextStream 對象。
示例:
Dim f
Set f = fso.CreateTextFile("c:\testfile.txt", True)
21、OpenTextFile 方法
語法:object.OpenTextFile(filename[, iomode[, create[, format]]])
作用:打開一個指定的文件并返回一個 TextStream 對象,該對象可用于對文件進行讀、寫、追加操作。
說明:
?iomode 參數(shù)可為下面設置值中的任何值:
ForReading 1 打開一個只讀文件,不能對此文件進行寫操作。
ForWriting 2 打開一個用于寫操作的文件。如果和此文件同名的文件已存在,則覆蓋以前內(nèi)容。
ForAppending 8 打開一個文件并寫到文件的尾部。
注意:在VBA幫助里是沒有ForWriting的,其實是有的,VBA幫助也是有錯誤的。另外,這些常數(shù)在使用前要先聲明,或者直接用數(shù)值。
?create 可選的,它表示如果指定的 filename 不存在是否可以創(chuàng)建一個新文件。如果創(chuàng)建新文件,其值為 True。若不創(chuàng)建文件其值為 False。缺省值為 False。
?Format 參數(shù)可為下面設置值中的任何值:
TristateUseDefault –2 使用系統(tǒng)缺省打開文件。
TristateTrue –1 以 Unicode 格式打開文件。
TristateFalse 0 以 ASCII 格式打開文件。
示例:
Dim f
Set f = fso.OpenTextFile("c:\testfile.txt", 2, True)
或者:
Const ForWriting = 2
Set f = fso.OpenTextFile("c:\testfile.txt", ForWriting, True)
這兩者功能是一樣的,一個聲明了常量,一個直接用數(shù)值。都是在C盤創(chuàng)建文件testfile.txt(如不存在),或以寫的方式打開(如存在)。
22、CopyFile 方法
語法:object.CopyFile source, destination[, overwrite]
作用:把一個或多個文件從一個地方復制到另一個地方。
說明:需要注意的地方與CopyFolder是完全類似的。
示例:
fso.copyfile "c:\testfile.txt", "f:\abc\" '若abc不存在則出錯。
fso.copyfile "c:\testfile.txt", "f:\abc" '若abc不存在則復制testfile.txt到F盤文件名變?yōu)閍bc,若abc存在,出錯,因為是一個目錄。
23、MoveFile 方法
語法:object.MoveFile source, destination
作用:將一個或多個文件從一個地方移動到另一個地方。
說明:需要注意的地方與MoveFolder是完全類似的。
24、DeleteFile 方法
語法:object.DeleteFile filespec[, force]
作用:刪除一個指定的文件。
說明:force 可選的。如果要刪除具有只讀屬性設置的文件,其值為 True。如果其值為 False (缺省),則不能刪除具有只讀屬性設置的文件。
(三)處理驅動器
可以利用Drive對象來獲取有關各種驅動器的信息,Drive對象的屬性有:
TotalSize 屬性 驅動器的總容量,以字節(jié)為單位。
AvailableSpace 屬性 驅動器的可用空間容量,以字節(jié)為單位。
FreeSpace 屬性 驅動器的剩余空間容量,和 AvailableSpace 屬性是相同的。
對于支持限額的計算機系統(tǒng)來說,二者之間可能有所不同。
DriveLetter 屬性 驅動器字母,即盤符。
DriveType 屬性 驅動器的類型。如"Removable"、"Fixed"、"Network"、"CD-ROM"、"RAM Disk"
SerialNumber 屬性 驅動器的序列號。
FileSystem 屬性 驅動器所使用的文件系統(tǒng)類型。如FAT、FAT32、NTFS、以及 CDFS。
IsReady 屬性 驅動器是否可用。
ShareName 屬性 驅動器的網(wǎng)絡共享名。
VolumeName 屬性 驅動器的卷標名。
Path 屬性 驅動器的路徑。C 驅動器的路徑是 C:,而不是 C:\。
RootFolder 屬性 定驅動器的根文件夾。C 驅動器的根文件夾是 C:\。
這些屬性的使用都十分簡單,直接用“對象.屬性”就可以了。在使用前要先用GetDrive獲得一個Drive對象,注意不能創(chuàng)建一個驅動器對象。下面舉個例子:
Sub ShowFreeSpace(drvPath)
Dim fs, d, s
Set fs = CreateObject("Scripting.FileSystemObject")
Set d = fs.Getdrive(fs.GetDriveName(drvPath))
s = "Drive " & UCase(drvPath) & "-"
s = s & d.VolumeName & vbCrLf
s = s & "Free Space: " & FormatNumber(d.FreeSpace / 1024, 0)
s = s & " Kbytes"
MsgBox s
End Sub
利用Call ShowFreeSpace("c:"),即可獲得C盤的卷標名和可用空間。
(四)處理文件夾
1、獲取文件夾的信息
可以利用Folder對象來獲取有關文件夾的信息,F(xiàn)older對象的屬性有:
Attributes 屬性 文件夾的屬性。可為下列值中的任意一個或任意的邏輯組合:
Normal 0 一般文件。未設置屬性。
ReadOnly 1 只讀文件。屬性為讀/寫。
Hidden 2 隱藏文件。屬性為讀/寫。
System 4 系統(tǒng)文件。屬性為讀/寫。
Volume 8 磁盤驅動器卷標。屬性為只讀。
Directory 16 文件夾或目錄。屬性為只讀。
Archive 32 自上次備份后已經(jīng)改變的文件。屬性為讀/寫。
Alias 64 鏈接或快捷方式。屬性為只讀。
Compressed 128 壓縮文件。屬性為只讀。
Name 屬性 文件夾名字。
ShortName 屬性 較早的 8.3 命名約定的程序所使用的短名字。
Type 屬性 文件夾類型。
Files 屬性 所有 File 對象組成的 Files 集合,這些 File 對象包含在指定的文件夾中
──包括設置了隱藏和系統(tǒng)文件屬性的那些文件。
Drive 屬性 文件夾所在的驅動器符號。
IsRootFolder 屬性 文件夾是否是根文件夾。
ParentFolder 屬性 文件夾的父文件夾對象。
SubFolders 屬性 文件夾的子文件夾集合。
Path 屬性 文件夾的路徑。
ShortPath 屬性 較早的 8.3 文件命名約定的程序所使用的短路徑。
Size 屬性 文件夾的大小,以字節(jié)為單位。
DateCreated 屬性 文件夾的創(chuàng)建日期和時間。
DateLastModified 屬性 最后一次修改文件夾的日期和時間。
DateLastAccessed 屬性 最后一次訪問文件夾的日期和時間。
屬性的使用和Drive對象是一樣的,可以用GetFolder獲取一個Folder對象,也可以用FileSystemObject對象的CreateFolder 方法創(chuàng)建一個Folder對象。
2、Folder對象的方法
⑴Copy 方法
語法:object.Copy destination[, overwrite]
作用:把一個指定的文件夾從一個地方復制到另一個地方。
說明:Copy 方法的作用與FileSystemObject對象的CopyFolder 方法是一樣的,不同在于后者可一次復制多個文件夾。
⑵Move 方法
語法:object.Move destination
作用:將一個指定的文件夾從一個地方移動到另一個地方。
說明:Move 方法的作用與FileSystemObject.MoveFolder 是一樣的。不同在于后者可一次移動多個文件夾。
⑶Delete 方法
語法:object.Delete force
作用:刪除一個指定的文件夾。
說明:Delete 方法的作用與FileSystemObject.DeleteFolder 是一樣的。
⑷CreateTextFile 方法
語法:object.CreateTextFile(filename[, overwrite[, unicode]])
作用:與FileSystemObject對象的CreateTextFile 方法是一樣的。
示例:
Set fd = fs.getfolder("c:\tmp")
Set f = fd.CreateTextFile("testfile.txt", True)
可在C盤tmp文件夾下創(chuàng)建testfile.txt文件。
(五)處理文件
1、獲取文件的信息
可以利用File對象來獲取有關文件的信息,F(xiàn)ile對象的屬性和Folder的屬性是完全一樣的,只是少了Files 屬性、IsRootFolder 屬性、SubFolders 屬性這3個屬性。這里就不列了。
2、File對象的方法
⑴Copy 方法
⑵Move 方法
⑶Delete 方法
以上三種方法與Folder的是完全類似的,語法也一樣,同樣也可用FileSystemObject對象相應的方法代替。
⑷OpenAsTextStream 方法
語法:object.OpenAsTextStream([iomode, [format]])
作用:打開一個指定的文件并返回一個 TextStream 對象,該對象可用來對文件進行讀、寫、追加操作。
說明:此方法與FileSystemObject對象的 OpenTextFile 方法相同的功能。參數(shù)也是一致的。
(六)處理文本文件
1、打開或創(chuàng)建文本文件
打開現(xiàn)有的文本文件,可以使用FileSystemObject對象的 OpenTextFile 方法或File對象的OpenAsTextStream 方法。
創(chuàng)建文件可以使用FileSystemObject對象的 CreatTextFile 方法或在OpenTextFile 方法中將iomode參數(shù)設為ForWriting=2,create參數(shù)設為True。
例如:
Set f = fso.OpenTextFile("c:\test1.xls", 2, True) '如果不存在test1.xls將自動創(chuàng)建。
2、讀取文件
打開文件后,將返回一個TextStream 對象,我們可以利用TextStream 對象的屬性及方法來對文件進行讀寫操作。
先看TextStream 對象的幾個屬性。
?AtEndOfLine 屬性 文件指針是否正好在行尾標記的前面
?AtEndOfStream 屬性 文件指針是否在 TextStream 文件末尾
?Column 屬性 TextStream 文件中當前字符位置的列號
?Line 屬性 TextStream 文件中的當前行號
利用TextStream 對象讀取文件有三種方法。
?Read 方法
語法:object.Read(characters)
功能:從一個 TextStream 文件中讀取指定數(shù)量的字符并返回得到的字符串。
示例:
Sub du()
Dim fso, a, retstring
Const ForReading = 1
Set fso = CreateObject("Scripting.FileSystemObject")
Set a = fso.OpenTextFile("c:\testfile.txt", ForReading, False)
Do While a.AtEndOfLine <> True '是否到行末
retstring = retstring & a.Read(1) '讀取一個字符
Loop
a.Close
Debug.Print retstring '可看到讀取了第一行的字符
End Sub
?ReadLine 方法
語法:object.ReadLine
功能:從一個 TextStream 文件讀取一整行(到換行符但不包括換行符)并返回得到的字符串。
示例:
Sub du_line()
Dim fso, a, retstring
Const ForReading = 1
Set fso = CreateObject("Scripting.FileSystemObject")
Set a = fso.OpenTextFile("c:\testfile.txt", ForReading, False)
Do While a.AtEndOfStream <> True '是否在 TextStream 文件末尾
retstring = a.ReadLine '讀取一行
Debug.Print retstring '顯示在立即窗口
Loop
a.Close
End Sub
?ReadAll 方法
語法:object.ReadAll
功能:讀取整個的 TextStream 文件并返回得到的字符串。
說明:對于大的文件,使用ReadAll方法浪費內(nèi)存資源。應使用其它的技術去輸入一個文件,比如按行讀取文件。
示例:
Sub du_all()
Dim fso, a, retstring
Const ForReading = 1
Set fso = CreateObject("Scripting.FileSystemObject")
Set a = fso.OpenTextFile("c:\testfile.txt", ForReading, False)
retstring = a.Readall '全部讀取
Debug.Print retstring
a.Close
End Sub
還有兩個輔助讀取的方法:
?Skip 方法
語法:object.Skip(characters)
功能:當讀一個 TextStream 文件時跳過指定數(shù)量的字符。
示例:
Sub duskip()
Dim fso, a, retstring
Const ForReading = 1
Set fso = CreateObject("Scripting.FileSystemObject")
Set a = fso.OpenTextFile("c:\testfile.txt", ForReading, False)
Do While a.AtEndOfLine <> True '是否到行末
retstring = retstring & a.Read(1) '讀取一個字符
a.Skip (1) '跳過一個字符
Loop
a.Close
Debug.Print retstring '可看到讀取了第一行的奇數(shù)位的字符
End Sub
?SkipLine 方法
語法:object.SkipLine
功能:當讀一個 TextStream 文件時跳過下一行。
3、寫入數(shù)據(jù)到文件
寫入數(shù)據(jù)到文件也有三種方法。
?Write 方法
語法:object.Write(string)
功能:寫一個指定的字符串到一個 TextStream 文件。
示例:
Sub xie()
Const ForWriting = 2, ForAppending = 8
Dim fs, f
Set fs = CreateObject("Scripting.FileSystemObject")
Set f = fs.OpenTextFile("c:\testfile.txt", ForAppending,TristateFalse)
f.Write "Hello world!" '寫入字符串
f.Close
End Sub
?WriteLine 方法
語法:object.WriteLine([string])
功能:寫入一個指定的字符串和換行符到一個 TextStream 文件中。
示例:
f.WriteLine("Hello world!") '寫入字符串,加一個換行符。
?WriteBlankLines 方法
語法:object.WriteBlankLines(lines)
功能:寫入指定數(shù)量的換行符到一個 TextStream 文件中。
示例:
f.WriteBlankLines(3) '相當于按3次回車。
4、關閉文件
利用TextStream 對象的Close方法,上面的示例中已經(jīng)有了,很簡單。
原文轉載于https://blog.csdn.net/langeldep/article/details/7069874
如果一個程序員從來沒有在linux,unix下開發(fā)過程序,一直在windows下面開發(fā)程序, 同樣是工作10年, 大部分情況下與在linux,unix下面開發(fā)10年的程序員水平會差別很大。我寫這篇文章并不是想貶低windows下面開發(fā)的人,做windows開發(fā)的人看了可能會感覺不舒服,我并不是這個意思,我只是說說我自己的感受,我最早開始學習編程也是在windows下面的, 學的是VB,后來轉到VC++,當時用的是VC6.0, 做windows下面的開發(fā)5年后轉入linux下面做開發(fā)的,開始在linux下面做開發(fā)的時候, 也做過很多windows下面的項目,在linux下面做開發(fā)確實比我在windows下面做開發(fā)多學到了很多的東西,從開源代碼里面吸取了豐富的營養(yǎng),我不是說我是個高手, 只是說在linux下面學習,你會進步的更快。
不過我需要強調(diào)一下,我這里說的是 “大部分情況下”,意思就是說“在同樣勤奮,同樣努力程度,同樣基礎知識,同樣工作年限,同樣是做應用程序的開發(fā)” 的情況下,如果說的不對,希望大家在下面發(fā)表看法。
可能大家會奇怪, 為何會出現(xiàn)這種情況呢 ?
聽我慢慢道來!
第一:閉源與開源
windows下面的程序基本都是封閉源代碼的,特別是10年前,在windows下可以說找不到可用的開源的軟件,現(xiàn)在的情況比以前好多了, 很多l(xiāng)inux下面開源的程序被移植到windows下面來,但是linux下面開源的程序增加的更多了。
以前在windows下面寫應用程序, 需要用到MFC,WINSOCK,ODBC,F(xiàn)ILE IO等, 可以找資料的地方主要是微軟官方的文檔MSDN,也只有MSDN才是最全的地方,下來是第三方網(wǎng)站 vckbase, CSDN, codeproject 這幾個網(wǎng)站。 但是從這些網(wǎng)站找到的代碼,都是針對一個特定的小功能,為了演示如何實現(xiàn)這個小功能而寫的代碼,寫代碼的水平參差不齊,風格各異,都是一些demo性質(zhì)的小東西,簡單研究看看代碼就可以集成到自己的應用程序里面。如何構建一個完整的應用程序, 架構良好的應用程序, 大學里面不會教你, 一切都得靠自己摸索,在公司里面做項目獲得提升,直到項目商用,后期維護修改代碼時, 回頭看自己寫的代碼, 才深刻體會到,自己當時寫的代碼架構是多么的不合理,維護修改是如此的困難。如果在互聯(lián)網(wǎng)上找不到自己需要的資料,就只能靠自己想一些實現(xiàn)的方法,雖然功能完成了, 可能完成的時候還很有成就感,但是等那天你突然發(fā)現(xiàn)有人實現(xiàn)這個功能,并且用了一個巧妙的方法, 這是你才突然恍悟, 我當時為何就想不到這么實現(xiàn)呢? 在windows下面開發(fā), 不太容易找到可以參考的類似你要完成功能的開源項目。一切都得靠自己。但是在linux下面就不一樣了, 當你要開發(fā)一個新項目時, 可以想想有沒有什么開源項目也完成了類似的功能, 可以下載到源代碼來做一個參考, 對其中的算法, 架構設計等做一個詳細的了解,然后自己開發(fā)的時候就會比較得心應手了,可以避免別人犯過的錯誤,少走很多彎路。
第二:要學習的知識量不一樣
學習window下的開發(fā), 你需要學習很多的Windows API,截止到2009年9月,Windows總API數(shù)量為2258個, 并且Windows API 的參數(shù)多, 參數(shù)類型復雜,要記住這么多東西不是一件容易的事情,至少也和學習一門外語一樣,大學英語四級要求掌握的總詞匯量達到4500個單詞。可想而知, 學會這么多的API用法,有多難了吧。那么學習linux下, 要掌握多少API呢 ? linux下的內(nèi)核API, 全部算下來也才335,但是這些內(nèi)核的API只有編寫驅動的時候才能用到, 開發(fā)應用程序基本用不到內(nèi)核的API,開發(fā)應用程序的API基本都是C的API,而 Linux所有的C的API個數(shù)是279個, 也就是說你只需要掌握不到300個的API, 就可以順利的在linux下面開發(fā)應用程序了,相比學習windows下面的那一堆API來說, 你是不是可以省下很多時間來學習其他知識呢?
下面我就舉個簡單的例子:
CreateFile
ReadFile
OpenFile
WriteFile
DeleteFile
ReadFileEx
WriteFileEx
CloseHandle
上面這些API是windows下面對文件操作的API, 總共是8個,看看CreateFile的參數(shù)吧,
HANDLE WINAPI CreateFile( __in LPCTSTR lpFileName, __in DWORD dwDesiredAccess, __in DWORD dwShareMode, __in LPSECURITY_ATTRIBUTES lpSecurityAttributes, __in DWORD dwCreationDisposition, __in DWORD dwFlagsAndAttributes, __in HANDLE hTemplateFile);
這些參數(shù)的意義和類型, 請問你需要花多少時間來掌握呢 ?
我們在看看linux下面對文件操作的C的API有幾個,
fopen, fwrite, fread, fclose 共四個,我們在看看參數(shù)吧
FILE *fopen( const char *filename, const char *mode ); 兩個參數(shù), 請問你需要花多少時間掌握呢。
可能有的人會提出意見,說上面C的API也能在windows下面運行啊? 沒錯, 是能在windows下面運行,但是你就掌握這跨平臺的C的API夠嗎? 難道所有在windows下面開發(fā)的人都喜歡用C的API, 不會用windows本身的API嗎?你不需要學習windows下面的API嗎? 你的同事使用了CreateFile這個函數(shù), 你不需要搞懂他嗎? 你不需要看同事的代碼嗎? 你不需要去維護別人寫過的代碼嗎?
如果你還是這么想,那我還可以再舉其他例子!就拿創(chuàng)建線程的例子吧,下面是2個在windows下面創(chuàng)建線程的例子, 第一個是創(chuàng)建安全工作線程, 第二個是創(chuàng)建界面線程,還有一個函數(shù)我沒有放下面, 是創(chuàng)建不安全的工作線程的,具體的原理大家可以參考《win32多線程程序設計》,
作者:(美)Jim Beveridge & Robert Wiener 著,侯捷 譯 這本書。
//線程安全的工作線程函數(shù) uintptr_t _beginthreadex( void *security, unsigned stack_size, unsigned ( *start_address )( void * ), void *arglist, unsigned initflag, unsigned *thrdaddr ); //界面線程函數(shù) HANDLE WINAPI CreateThread( __in LPSECURITY_ATTRIBUTES lpThreadAttributes, __in SIZE_T dwStackSize, __in LPTHREAD_START_ROUTINE lpStartAddress, __in LPVOID lpParameter, __in DWORD dwCreationFlags, __out LPDWORD lpThreadId );
做windows下面的開發(fā), 上面兩個創(chuàng)建線程的函數(shù)我們都必須掌握。當然了, 你也可以只需要知道 _beginthreadex 來在windows下面通吃,但是當看到別人的代碼使用CreateThread的時候, 你可不要不習慣,MFC里面很多人都用CreateThread。 掌握這么多的API累吧 ? 就和你上學的時候背單詞一樣累。
下面我在列一下linux下面創(chuàng)建線程的函數(shù)
int pthread_create( pthread_t *restrict thread, const pthread_attr_t *restrict attr, void *(*start_routine)(void*), void *restrict arg);
看到了吧, 你只需要知道這個就可以了。
C的API 絕大部分都可以再windows下面運行,在windows下面學習開發(fā), 你不但要懂得C的API, 你還需要多花時間來學習windows系統(tǒng)本身的API, 你可能要說, 這么說應該是windows下面學得多啊, 我要說的是你掌握的API是很多, 但是對于一個軟件來說, 最最重要的是系統(tǒng)架構,數(shù)據(jù)結構,架構設計的好, 對后期的代碼維護,功能修改都很關鍵, 這也就是新手寫的代碼, 到最后連他自己本人都很難維護的原因, 更別說讓別人來維護了。
API相當于基本功, 系統(tǒng)架構, 數(shù)據(jù)結構是內(nèi)功,基本功練的越快,我們就越有更多的時間來練習內(nèi)功。練習內(nèi)功,我們要多向高手學習。
在學習windows 下面開發(fā)應用的道路上, 我們需要掌握更多的API, 學習后, 讓我們的路越走越窄, 沒有特別豐富的開源代碼可以參考, 水平提高的速度很慢。
可喜的是, 現(xiàn)在很多開源的項目被很多人移植到了linux下面, 也有很多的開源項目是跨平臺的, 常用的是 wxWidget界面庫, 用法類似MFC, 還有qt這個界面庫, 也很強大,還有開源的3D引擎OGRE, 架構非常好,很值得學習其架構模式。但是linux下面的開源庫要遠遠比windows下面的開源庫豐富得多, 我們可以方便的從高手的代碼里面學習數(shù)據(jù)結構,學習設計模式,學習編程技巧,這也就是linux下面的程序員, 可能會比windows下面的程序員水平更高的原因, 畢竟見多識廣嘛, 熟讀唐詩三百首,不會作詩也會吟啊!
2019BAT等互聯(lián)網(wǎng)大廠崗位推薦集錦:https://github.com/0voice/enterprise_job_recommend
希望對大家有幫助~