24/05/2018, 22:48

Xử lý tập tin

Cung cấp cho ứng dụng khả năng tạo, thay đổi, di chuyển, xoá các thư mục, dò tìm xem chúng có tồn tại hay không, nếu có thì ở đâu. Nó cũng cho phép lấy các thông tin về thư mục như tên, ngày tạo, ngày sửa đổi gần nhất... Mô hình FSO ...

Cung cấp cho ứng dụng khả năng tạo, thay đổi, di chuyển, xoá các thư mục, dò tìm xem chúng có tồn tại hay không, nếu có thì ở đâu. Nó cũng cho phép lấy các thông tin về thư mục như tên, ngày tạo, ngày sửa đổi gần nhất...

Mô hình FSO chưa trong thư viện kịch bản (Scripting type library- csrrun.dll), hỗ

trợ tạo và thao tác với tập tin văn bản thông qua đối tượng TextStream. Nó chưa hỗ trợ tập tin nhị phân, ta phải dùng lệnh Open với cờ Binary.

Mô hình này chứa các đối tượng sau:

Đối tượng Giải thích
Drive Cho phép thu thập thông tin về ổ đĩa như dung lượng, tên chiasẻ... Lưu ý rằng không nhất thiết là ổ cứng. Nó có thể là CD- ROM, là ổ đĩa RAM, hoặc là ổ mạng.
Folder Cho phép tạo, xóa, di chuyển thư mục hay thu thập các thôngtin hệ thống như tên thư mục, đường dẫn...
Files Cho phép tạo, xoá, di chuyển tập tin hay thu thập các thông tinhệ thống....
FileSystemObject Các thuộc tính và phương thức cho phép tạo xóa, thu thậpthông tin về ổ đĩa, thư mục, tập tin.
TextStream Cho phép đọc và ghi văn bản

Nếu chưa có sẵn tham chiếu đến FSO bạn có thể reference đến nó từ menu Project eference...

Mặc dù có FSO, các lệnh cổ điển vẫn được hỗ trợ đầy đủ trong Visual basic. Nếu ta thiết kế ứng dụng để làm việc với cơ sở dữ liệu, ta sẽ không cần cung cấp các truy cập đến tập tin. Điều khiển dữ liệu và ràng buộc dữ liệu cho phép đọc và ghi dữ liệu trực tiếp trên cơ sở dữ liệu, dễ dàng hơn truy cập đến tập tin.

Các kiểu truy cập tập tin

Tập tin là một dãy các byte lưu trên đĩa. Khi ứng dụng truy cập đến tập tin, nó xem các byte như là ký tự, bản ghi,số, chuỗi...Có 3 kiểu truy cập tập tin:

- Tuần tự:đọc và ghi các tập tin văn bản theo cá chuỗi liên tục.

- Ngẫu nhiên:đọc và ghi tập tin văn bản hoặc nhị phân có cấu trúc theo các bản ghi có chiều dài xác định

- Nhị phân:đọc và ghi các tập tin có cấu trúc không xác định.

Hàm truy cập tập tin

H à m/ d ò ng lệnh T u n tự Ngẫu nhiên N hị p hân
Close X X X
Get X X
Input() X X
Input # X
Line Input # X
Open X X X
Print # X
Put X X
Type.. End type X
Write # X

Tập tin tuần tự

Mở tập tin tuần tự

Open pathnameFor|Input | Output |Append |Asfilenumber | Len =buffersize| Khi mở một tập tin tuần tự với Input,tập tin phải có sẵn. Nếu không Visual basic sẽ báo lỗi. Khi ta mở một tập tin chưa có sẵn với Outputhoặc Appendlệnh Open sẽ tạo mới tập tin và mở nó.

Tham số tuỳ chọn Len chỉ ra số ký tự trong vùng đệm khi sao chép dữ liệu giữa tập tin và chương trình.

Sau khi mở tập tin với Input, Output hoặc Append ta phải đóng nó bằng lệnh Close.

Soạn thảo tập tin

Trước hết, đọc nội dung tập tin vào biến, sửa biến và ghi biến vào tập tin.

Đọc chuỗi từ tập tin

Mở tập tin với Input. Sau đó, dùng dòng lệnh line Input #, Input() hoặc Input # để sao chép nội dung tập tin vào biến. Visual basic cung cấp những hàm để đọc ghi 1 ký tự hoặc một dòng vào tập tin. Đoạn code sau đọc từng dòng: Dim LinesFromFile, NextLine As String

Do Until EOF(FileNum)
    Line Input #FileNum, NextLine
    LinesFromFile = LinesFromFile + NextLine + Chr(13) + Chr(10) Loop
    

Mặc dù Line Input# nhận ra cuối chuỗi khi nó đọc đến ký tự xuống dòng, nhưng nó không lấy ký tự này khi đưa và biến. Nếu muốn lấy ký tự xuống dòng ta phải tự xử lý code.

Ta cũng có thể dùng Input # để đọc một danh sách gồm các số hay chuỗi trong tập tin. Ví dụ, để đọc một dòng trong tập tin danh sách thư điện tử:

Input #filename, name, street, city,state,zip
    

Dùng Input để sao chép một số ký tự từ tập tin vào biến: LinesFromFile = Input(n, Filename)

Để copy toàn bộ tập tin vào biến, dùng InputB để copy từng byte. Vì InputB trả về chuỗi ANSI, ta phải dùng StrConv để chuyển đổi từ ANSI sang UNICODE.

LinesFromFile= StrConv(InputB(LOF(FileNum), FileNum), vbUnicode)
    

Ghi chuỗi và tập tin

Để ghi nội dung biến vào tập tin, mở tập tin với Output hay Append, sau đó dùng Print #. Ví dụ, tình soạn thảo văn bản copy nội dung của hộp văn bản vào tập tin: Print #FileNum, Thebox.text

Visual basic cũng hỗ trợ lệnh Write #, dùng để ghi một danh sách các số, chuỗi vào tập tin. Dấu phẩy được dùng để tách biệt:

Dim strString as String, intNumber as Integer strString = “AnyCharacters”
    intNumber = 23456
    Write #Filenum, strString, intNumber
    

Đoạn code này ghi một chuỗi và một số vào một tập tin được chỉ ra bởi FileNum.

Tập tin ngẫu nhiên

Mô hình FSO không hỗ trợ tập tin ngẫu nhiên. Các byte trong tập tin truy cập ngẫu nhiên có dạng bản ghi đồng nhất, mỗi bản ghi chứa một hoặc nhiều trường. Mỗi trường có kiểu và kích thước xác định. Mỗi bản ghi có nhiều trường tương đương kiểu người dùng định nghĩa. Ví dụ: Kiểu worker tạo mẫu tin 19 bytes gồm 3 trường:

Type worker
   LastName As String *10
   Tilte As String * 7
   Rank As String *2
   End Type
    

Sau khi định nghĩa kiểu mẫu tin, khai báo các biến mà ứng dụng cần để xử lý 1 tập tin mở để truy cập ngẫu nhiên: Public Employee as worker

Mở tập tin ngẫu nhiên

Open pathname [ For Random ] As filenumber Len = reclength
    

Vì Random là kiểu mặc định từ khoá Forrandomlà tuỳ chọn.

Biểu thức Len=reclengthchỉ ra kích thước tính bằng byte của một bản ghi. Lưu ý rằng mỗi biển chuỗi trong Visual basic chứa một chuỗi Unicode và ta phải chỉ ra chiều dài tính bằng byte của chuỗi đó. Nếu reclengthnhỏ hơn chiều dài thực sự của bản ghi ghi đến tập tin, lỗi sé sinh ra. Nếu reclengthlớn hơn chiều dài thực sự của bản ghi, bản ghi sẽ được ghi, mặc dù một số khoảng trống đĩa bị lãng phí.

Tập tin truy cập nhị phân

Trong mô hình FSO không hỗ trợ tập tin này. Dùng tập tin nhị phân khi yêu cầu kích thước tập tin nhỏ. Khi thao tác nên dùng biến byte thay vì String, vì dữ liệu nhị phân không thể chứa đúng vào biến String.

Mở tập tin nhị phân

Cú pháp lệnh:

Open pathname For Binary As filenumber
    

Chứa thông tin trong các trường hợp có độ dài thay đổi

Ta có thể giảm thiểu việc sử dụng khoảng trống đĩa bằng tập tin nhị phân.

Type Person
    ID As Integer
    MonthlySalary As Currency LastReviewDate As Long FirstName As String LastName As String
    Tilte As String
    End Type
    Public Empl As Person
    

Mỗi bản ghi chỉ chứa một số byte cần thiết do các trường có chiều dài biến đổi. Trở ngại là ta không thể truy cập bản ghi một cách ngẫu nhiên, mà ta phải truy cập

tuần tự theo độ dài của mỗi bản ghi. ta có thể tìm một byte trong tập tin, ngưng không thể biết byte đó thuộc bản ghi nào.

- Hộp danh sách ổ đĩa

- Hộp danh sách thư mục

- Hộp danh sách tập tin

Điều khiển hệ thống tập tin lấy thông tin tự động từ hệ điều hành, ta có thể truy cập hoặc quyết định nên hiển thị những phần nào thông qua các thuộc tính của chúng.

Hộp danh sách ổ đĩa

Là hộp danh sách kiểu drop down ổ đĩa. Mặc định là ổ đĩa hiện hành được hiển thị trên hệ thống của người sử dụng. khi điều khiển có forcus, NSD có thể gx vào một tên ổ đĩa hợp lệ hoặc nhấn chuột để chọn một ổ đĩa trong danh sách các ổ đĩa. Nếu Người sử dụng chọn một ổ đĩa mới tên mới sẽ hiện thị nên đầu danh sách.

Ta có thể dùng code để quy định ổ đĩa được chọn. Drive1.Drive = “C:”

Chọn một ổ đĩa không làm thay đổi ổ điãc hiện hành, trừ phi ta lấy thuộc tính Drive gán cho hàm ChDrive

ChDrive = Drive1.Drive
    

Hộp danh sách thư mục

Hộp danh sách thư mục hiển thị cấu trúc thư mục của ổ đĩa hiện hành trên hệ thống, bắt đầu bằng thư mục gốc. Cấu trúc thể hiện hình cây phân nhánh. Thư mục hiện hành trở thành đậm và thụt vào so với thư mục cha và cứ thế thụt vào cho đến thư mục gốc. Khi người sử dụng di chuyển chuột lên xuống, mỗi thư mục trở thành đậm.

Xác định từng thư mục

Mỗi thư mục trong hộp có một số hiệu kèm theo. Khả năng này không được hỗ trợ trong hộp thoại thông dụng. Thư mục chỉ ra bởi thuộc tính Path (Dir1.Path) luôn có listIndex là -1. Thư mục ngay sát bên trên nó có listIndex là -2, kế tiếp là -3....đến gốc. Thư mục con đầu tiên của Dir1.Path có listIndex là 0. Nếu có nhiều thư mục con ở mức này thì kế tiếp nó có ListIndex là 1, tiếp theo là 2...

Định thư mục hiện hành

Dùng thuộc tính Path của hộp danh sách thư mục để xem hoặc quy đinh thư mục hiện hành (ListIndex =-1). Ví dụ gán “C:Luong” vào Drive1.Path thì Luong là thư mục hiện hành.

Tương tự, ta có thể gán thuộc tính Path của hộp danh sách thư mục là thuộc tính Drive của hộp danh sách ổ đĩa.

Dir1.Path = Drive1.Drive
    

Khi đó, hộp danh sách thư mục hiện thị tất cả thư mục ở trên, và các thư mục ngay ngay mục hiện hành của ổ. Tuy nhiên nó không quy định thư mục hiện hành ở mức hệ điều hành, nó chỉ làm nổi bật và cho nó giá trị ListIndex = -1.

Để định thư mục hiện hành dùng lệnh ChDir.

ChDir Dir1.Path
    

Trong một ứng dụng dùng các điều khiển tập tin, ta có thể định thư mục hiện hành là thư mục chứa tập tin EXE thông qua đối tượng Application: ChDrive App.Path

ChDir App.Path
    

Chú ý thuộc tính Path chỉ có thể được sử dụng trong lúc chạy chương tình không có sẵn vào lúc thiết kế.

Nhấn chuột vào một thành phần trong Hộp danh sách thư mục

Khi nhấn chuột vào một thành phần thì nó trở thành đậm. Khi ngườ sử dụng nhấn đúp chuột lên đó, nó được gán xào thuộc tính Path, và ListIndex được đổi thành -1. Hộp danh sách thư mục được đổi lại để hiện thị các thư mục con.

Tìm vị trí tương đối của thư mục

Thuộc tính ListCount trả về số thư mục bên dưới thư mục hiện hành, không phải tổng số thành phần trong hộp danh sách thư mục.

Hộp danh sách tập tin

Liệt kê các tập tin chứa trong thư mục chỉ ra bởi thuộc tính Path. Ta cũng có thể hiển thị các tập tin trong thư mục hiện hành trên ổ đĩa hiện hành:

File1.Path = Dir1.Path
    

Ta có thể hiển thị các tập tin thông qua điều kiện lọc dùng thuộc tính Pattern Ví

dụ:

File1.Pattern = "*.frm; *.bas"
    

Visual basic hỗ trợ ký tự “?” VD: “???.txt” hiển thị tất cả các tậpt in có phần mở

rộng là “.txt”

Làm việc ví thuộc tính của tập tin

Thuộc tính bao gồm: Archive, Normal, System, Hidden và ReadOnly. Ta có thể dùng thuộc tính để chỉ ra loại tập tin nào sẽ được hiển thị trong danh sách. Bởi mặc định, giá trị của các thuộc tính System và Hidden là False; Normal, Archive và ReadOnly là True.

Để hiển thị chỉ những tập tin ReadOnly chỉ cần đổi thuộc tính này là true và các thuộc tính khác là False

Cho phép Người sử dụng nhập văn bản và thực hiện một số thao tác định dạng giống như nạp, ghi dữ liệu trong một trình soạn thảo văn bản.

Ta cũng có thể đánh dấu đoạn văn bản, chuyển thành ký tự đậm, nghiêng...ta cũngcó thể canh trái, canh phải các đoạn văn bản.

Điều khiển cho phép mở và ghi tập tin dước dạng rtf và ascci thông qua hàm loadfile và Savefile.

Để dùng điều khiển RichTextBox ta thêm tập tin Richtx32.ocx và đề án. khi chạy ứng dụng cài tập tin này trong thư mục system của windows.

Phương thức loadfile

Cú pháp: Object.LoadFile pathname, filetype

Pathnamelà đường dẫn đến tập tin

fileType:Tuỳ chọn, là hằng số thể hiện kiểu tập tin:

Hằng Giá trị Gi i thích
rtfRTF 0 (Mặc định) RTF, tập tin lưu phải là tập tin.rtf hợp lệ
rtfText 1 Văn bản, điều khiển đang lưu tệp văn bản.

Khi nạp một tập tin dùng LoadFile, toàn bộ nội dung của điều khiển được thay thế bằng nội dung tập tin. Điều này làm giá trị của thuộc tính Text và rftText thay đổi

Ta cũng có thể dùng hàm Input và thuộc tính TxtRTF và selRTF để đọc tập tin.rtf ví dụ, ta có thể đọc nội dung tập tin vào điểu khiển như sau: Open “Mytext.rtf” For Input As 1

RichTextBox2.TextRTF = strconv(InputB$(LOF(1),1), vbUniCode)
    

Lưu nội dung của điều khiển RichTextbox vào tập tin Cú pháp: Object.SaveFile( pathname,filetype) Pathnamelà đường dẫn đến tập tin

fileType:Tuỳ chọn, là hằng số thể hiện kiểu tập tin:

Hằng Giá trị Gi i thích
rtfRTF 0 (Mặc định) RTF, tập tin lưu phải là tập tin.rtf hợp lệ
rtfText 1 Văn bản, điều khiển đang lưu tệp văn bản.

Ta cũng có thể dùng hàm Write và thuộc tính TextRTF và SelRTF để ghi vào tập tin.rtf. Ta cũng có thể lưu nội dung được đánh dấu trong điều khiển vào tập tin.rtf: Open “Mytext.rtf” For Output As 1

Print #1,RichTextBox2.SelRTF
    
0