• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

Các giải pháp làm việc với hệ thống tập tin trong .NET

Các thủ thuật về hệ thống, thư mục, tập tin và mạng

Điều hành viên: tungcan5diop, QUANITGROBEST

neverland87
Guru
Guru
Bài viết: 490
Ngày tham gia: T.Bảy 26/05/2007 4:31 pm
Been thanked: 8 time

Các giải pháp làm việc với hệ thống tập tin trong .NET

Gửi bàigửi bởi neverland87 » T.Ba 03/06/2008 7:44 am

Tên bài viết: Các giải pháp làm việc với hệ thống tập tin trong .NET
Tác giả: neverland87
Cấp độ bài viết: Newbie
Tóm tắt:



Giải pháp 1
Tạo, sao chép, di chuyển và xóa một tập tin


Vấn đề đặt ra: bạn cần tạo một file, sao chép hay di chuyển một file hiện có, hoặc xóa một file nào đó.

Giải pháp:
Trong .NET, namespace System.IO có 2 class làm thỏa mãn vấn đề trên: File và FileInfo. Lớp File chỉ chứa các method tĩnh (static) mà thôi, trong khi đó lớp FileInfo chỉ chứa các phương thức thể hiện (instance).
Phương thức tĩnh Create của lớp File trả về một thể hiện của lớp FileStream, mà bạn có thể sử dụng lớp này để đọc hoặc ghi vào các tập tin vừa được tạo ra. Ví dụ, dòng code dưới đây tạo một tập tin mới:

Mã: Chọn hết

  1. Imports System
  2. Imports System.Collections.Generic
  3. Imports System.Text
  4.  
  5. Namespace ConsoleApplication1
  6.     Class Program
  7.         Private Shared Sub Main(ByVal args As String())
  8.             Dim fs As FileStream = Nothing
  9.             If Not System.IO.File.Exists("C:\vidu.txt") Then
  10.                 fs = File.Create("C:\vidu.txt")
  11.             End If
  12.         End Sub
  13.     End Class
  14. End Namespace


Phương thức thể hiện của lớp FileInfo không nhận tham số nào cả. Khi khởi tạo một thể hiện của lớp này, bạn phải cung cấp 1 đường dẫn với tên tập tin làm tham số.

Dim fi As New System.IO.FileInfo("C:\vidu.txt")

Đoạn code dưới đây minh họa việc sử dụng phương thức Create của lớp FileInfo:

Mã: Chọn hết

  1. Imports System
  2. Imports System.Collections.Generic
  3. Imports System.Linq
  4. Imports System.Text
  5. Imports System.IO
  6.  
  7. Namespace ConsoleApplication1
  8.     Class Program
  9.         Private Shared Sub Main(ByVal args As String())
  10.             Dim fi As FileInfo = Nothing
  11.             Dim fileStream As FileStream = Nothing
  12.             If Not File.Exists("C:\vidu.txt") Then
  13.                 fi = New FileInfo("C:\vidu.txt")
  14.                 fileStream = fi.Create()
  15.             End If
  16.         End Sub
  17.     End Class
  18. End Namespace


Như bạn thấy, phương thức Create của lớp FileInfo trả về một thể hiện của lớp FileStream, từ đó bạn có thể dùng nó để đọc hoặc ghi vào một file vừa tạo ra.

Bạn có thể sao chép một file bằng cách sử dụng phương thức tĩnh File.Copy được quá tải. Ví dụ:

Mã: Chọn hết

  1. Imports System
  2. Imports System.Collections.Generic
  3. Imports System.Linq
  4. Imports System.Text
  5. Imports System.IO
  6.  
  7. Namespace ConsoleApplication1
  8.     Class Program
  9.         Private Shared Sub Main(ByVal args As String())
  10.             If File.Exists("C:\vidu.txt") Then
  11.                 File.Copy("C:\vidu.txt", "D:\vidu.txt")
  12.             End If
  13.         End Sub
  14.     End Class
  15. End Namespace


Đoạn code trên có công dụng là sao chép file vidu.txt nằm trong ổ C:\ đến ổ D:\, Bạn cũng cần biết đối số thứ ba của phương thức này nhận 1 kiểu bool (true hoặc false) để biết là bạn có muốn ghi đè một tập tin đích hiện có hay không

Phương thức thể hiện CopyTo của lớp FileInfo trả về một đối tượng FileInfo vốn trình bày file vừa được sao chép. Phương thức này cũng có thể lấy một giá trị bool tại một trong số các tham số ghi đè để biểu thị mục đích của bạn là muốn ghi đè file hay không? Ví dụ:

Mã: Chọn hết

  1. Imports System
  2. Imports System.Collections.Generic
  3. Imports System.Linq
  4. Imports System.Text
  5. Imports System.IO
  6.  
  7. Namespace ConsoleApplication1
  8.     Class Program
  9.         Private Shared Sub Main(ByVal args As String())
  10.             Dim fi As New FileInfo("C:\vidu.txt")
  11.             fi.CopyTo("D:\\vidu.txt", True)
  12.         End Sub
  13.     End Class
  14. End Namespace



Bạn có thể di chuyển một file bằng cách sử dụng phương thức tĩnh Move của lớp File. Ví dụ:

Mã: Chọn hết

  1. Imports System
  2. Imports System.Collections.Generic
  3. Imports System.Linq
  4. Imports System.Text
  5. Imports System.IO
  6.  
  7. Namespace ConsoleApplication1
  8.     Class Program
  9.         Private Shared Sub Main(ByVal args As String())
  10.             If File.Exists("C:\vidu.txt") Then
  11.                 File.Move("C:\vidu.txt", "D:\vidu.txt")
  12.             End If
  13.         End Sub
  14.     End Class
  15. End Namespace


Cũng cần lưu ý là phương thức này sẽ báo lỗi khi ở địa chỉ đích đã có 1 tập tin trùng tên với tập tin ở thư mục nguồn.

Bạn cũng có thể dùng phương thức MoveTo của lớp FileInfo. Ví dụ:

Mã: Chọn hết

  1. Imports System
  2. Imports System.Collections.Generic
  3. Imports System.Linq
  4. Imports System.Text
  5. Imports System.IO
  6.  
  7. Namespace ConsoleApplication1
  8.     Class Program
  9.         Private Shared Sub Main(ByVal args As String())
  10.             Dim fi As New FileInfo("D:\vidu.txt")
  11.             If Not File.Exists("C:\vidu.txt") Then
  12.                 fi.MoveTo("C:\vidu.txt")
  13.             End If
  14.         End Sub
  15.     End Class
  16. End Namespace


Bạn có thể xóa một file bằng cách sử dụng phương thức tĩnh Delete của lớp File hoặc phương thức Delete của lớp FileInfo như 2 ví dụ dưới đây:

Mã: Chọn hết

  1. Imports System
  2. Imports System.Collections.Generic
  3. Imports System.Linq
  4. Imports System.Text
  5. Imports System.IO
  6.  
  7. Namespace ConsoleApplication1
  8.     Class Program
  9.         Private Shared Sub Main(ByVal args As String())
  10.             If File.Exists("C:\vidu.txt") Then
  11.                 File.Delete("C:\vidu.txt")
  12.             End If
  13.         End Sub
  14.     End Class
  15. End Namespace


Mã: Chọn hết

  1. Imports System.Collections.Generic
  2. Imports System.Linq
  3. Imports System.Text
  4. Imports System.IO
  5.  
  6. Namespace ConsoleApplication1
  7.     Class Program
  8.         Private Shared Sub Main(ByVal args As String())
  9.             If File.Exists("C:\vidu.txt") Then
  10.                 Dim fi As New FileInfo("C:\vidu.txt")
  11.                 fi.Delete()
  12.             End If
  13.         End Sub
  14.     End Class
  15. End Namespace


Cũng gần kết thúc giải pháp đầu rồi, có thể câu hỏi bạn dành cho mình là “2 lớp này có các phương thức tương đương nhau, vậy tôi nên dùng cái nào?”. Câu trả lời của mình là: “tùy bạn!”. Nếu như bạn muốn “hạ gục nhanh-tiêu diệt gọn” thì sử dụng các phương thức tĩnh của lớp File, còn khi bạn đang thực hiện nhiều thao tác trên một file, chẳng hạn như việc tạo lập, di chuyển và thay đổi các thuộc tính của nó, hãy dùng các phương thức thể hiện của lớp FileInfo.
Cũng cần phải có một lưu ý nho nhỏ: các phương thức thể hiện đòi hỏi một đối tượng phải được tạo ra trước khi nó được gọi. ==> nếu bạn muốn giảm thiểu số đối tượng mà Garbage Collection phải quản lý, hãy nghĩ đến việc sử dụng phương thức tĩnh.


Còn tiếp...


SIMPLY THE BEST - ĐƠN GIẢN LÀ TỐT NHẤT

neverland87
Guru
Guru
Bài viết: 490
Ngày tham gia: T.Bảy 26/05/2007 4:31 pm
Been thanked: 8 time

Re: Các giải pháp làm việc với hệ thống tập tin trong .NET

Gửi bàigửi bởi neverland87 » T.Tư 04/06/2008 7:24 am

Giải pháp 2
Xem sửa timestamp của tập tin


Vấn đề: Bạn cần hiển thị hoặc thao tác các thuộc tính hay là timestamp của một file

Giải pháp: Để hiển thị các timestamp của một file, bạn có thể sử dụng hoặc là các phương thức tĩnh của lớp File, hoặc là các thuộc tính của lớp FileInfo. Các phương thức tĩnh là: GetCreationTime, GetLastAccessTime và GetLastWriteTime. Mỗi phương thức đều có một tham số đơn, đường dẫn và tên của tập tin chứa thông tin timestamp được trả về, và trả về một giá trị DateTime hiện chứa timestamp liên quan. Ví dụ:

Mã: Chọn hết

  1. Public Sub HienThiTimeStamp(ByVal path As String)
  2.         Console.WriteLine(File.GetCreationTime(path).ToString)
  3.         Console.WriteLine(File.GetLastAccessTime(path).ToString)
  4.         Console.WriteLine(File.GetLastWriteTime(path).ToString)
  5. End Sub



Các thuộc tính thể hiện của lớp FileInfo là CreationTime, LastAccessTime, và LastWriteTime. Mỗi thuộc tính trả về một giá trị DateTime chứa timestamp tương ứng của file được trình bày đối tượng FileInfo. Ví dụ:

Mã: Chọn hết

  1. Public Sub HienThiTimeStamp_FileInfo(ByVal path As String)
  2.         Dim fi As New FileInfo(path)
  3.         Console.WriteLine(fi.CreationTime.ToString)
  4.         Console.WriteLine(fi.LastAccessTime.ToString)
  5.         Console.WriteLine(fi.LastWriteTime.ToString)
  6. End Sub


Để chỉnh sửa các timestamp của một file, bạn có thể sử dụng hoặc là các phương thức tĩnh của lớp File, hoặc các thuộc tính của lớp FileInfo. Các phương thức tĩnh là: SetCreationTime, SetLastAccessTime và SetLastWriteTime. Ví dụ:

Mã: Chọn hết

  1. Public Sub ThietLapThuocTinhFile(ByVal path As String)
  2.         File.SetCreationTime(path, DateTime.Parse("May 10,2005"))
  3.         File.SetLastAccessTime(path, DateTime.Parse("May 11,2005"))
  4.         File.SetLastWriteTime(path, DateTime.Parse("May 12,2005"))
  5. End Sub


Còn ví dụ bên dưới khi sử dụng lớp FileInfo:

Mã: Chọn hết

  1. Public Sub ThietLapThuocTinhFile_FileInfo(ByVal path As String)
  2.         Dim fi As New FileInfo(path)
  3.         Dim dt As New DateTime(2001, 2, 9)
  4.         fi.CreationTime = dt
  5.         fi.LastAccessTime = dt
  6.         fi.LastWriteTime = dt
  7. End Sub
SIMPLY THE BEST - ĐƠN GIẢN LÀ TỐT NHẤT

neverland87
Guru
Guru
Bài viết: 490
Ngày tham gia: T.Bảy 26/05/2007 4:31 pm
Been thanked: 8 time

Re: Các giải pháp làm việc với hệ thống tập tin trong .NET

Gửi bàigửi bởi neverland87 » T.Sáu 06/06/2008 6:53 pm

Giải pháp 3
Đặt lại tên một tập tin


Vấn đề: Bạn cần đặt lại tên một tập tin

Giải pháp:
Mới nhìn qua, bạn cảm thấy điều này là dễ dàng, tuy nhiên, .NET không hỗ trợ phương thức nào giúp bạn trực tiếp đổi tên tập tin. Thay vào đó, bạn phải sử dụng phương thức tĩnh Move của lớp File, hoặc phương thức MoveTo của lớp FileInfo.
Ví dụ:

Mã: Chọn hết

  1. Public Sub RenameFile(ByVal orgName As String, ByVal newName As String)
  2.         System.IO.File.Move(orgName, newName)
  3. End Sub


Mã: Chọn hết

  1. Public Sub RenameFile_FileInfo(ByVal orgFile As System.IO.FileInfo, ByVal newName As String)
  2.         orgFile.MoveTo(newName)
  3. End Sub
SIMPLY THE BEST - ĐƠN GIẢN LÀ TỐT NHẤT

neverland87
Guru
Guru
Bài viết: 490
Ngày tham gia: T.Bảy 26/05/2007 4:31 pm
Been thanked: 8 time

Re: Các giải pháp làm việc với hệ thống tập tin trong .NET

Gửi bàigửi bởi neverland87 » T.Bảy 07/06/2008 12:45 pm

Giải pháp 4
Kiểm tra sự tồn tại của một tập tin


Vấn đề: bạn cần kiểm tra sự tồn tại của một file trên các thiết bị lưu trữ

Giải pháp: Sử dụng phương thức tĩnh Exists của lớp File để xác định xem file hiện tồn tại hay không:

Mã: Chọn hết

  1. 'nếu tồn tại file C:\vidu.txt
  2. If System.IO.File.Exists("C:\vidu.txt") = True Then
  3.     'làm điều gì đó...
  4. End If


Việc kiểm tra một file thường là bước then chốt đối với chương trình của bạn. Nếu một file đã có và sau đó bạn cố tạo ra nó, thì sẽ gặp phải một trong 3 tình huống sau:
+ Hoặc file hiện có sẽ bị ghi đè.
+ Hoặc nếu file hiện có ở dạng read-only thì chương trình sẽ ném ra 1 ngoại lệ
+ Hoặc một ngoại lệ được đưa ra cho biết trạng thái của filesystem nằm ngoài những gì bạn nghĩ!
SIMPLY THE BEST - ĐƠN GIẢN LÀ TỐT NHẤT

neverland87
Guru
Guru
Bài viết: 490
Ngày tham gia: T.Bảy 26/05/2007 4:31 pm
Been thanked: 8 time

Re: Các giải pháp làm việc với hệ thống tập tin trong .NET

Gửi bàigửi bởi neverland87 » CN 08/06/2008 10:17 am

Giải pháp 5
Lựa chọn phương thức mở một File hay Stream để đọc hoặc ghi


Vấn đề: Bạn là người mới chân ướt chân ráo đến với khu vườn .NET rộng thênh thang với hàng tá thư viện cho việc thao tác với tập tin. Bạn phân vân không biết phải sử dụng lớp nào để thực hiện công việc đọc/ghi tập tin? Bài viết này sẽ chỉ dẫn cho bạn.

Giải pháp:
Sử dụng các luồng (stream) file để thực hiện nhiều chức năng xử lý file khác nhau. Có 5 kiểu cơ bản về các lớp thao tác luồng file dựng sẵn mà bạn có thể sử dụng để đọc/ghi vào luồng file:

+FileStream: cho hầu hết điều khiển mịn, sử dụng FileStream cho việc thao tác file, bởi vì nó phần lớn cung cấp mức truy cập thấp vào file, và do vậy nhiều hành động phức tạp trở nên có sẵn. Một số hành động này là đọc và ghi các file ở dạng đồng bộ và không đồng bộ, các phương thức để khóa và mở khóa từng phần hay tất cả file, tìm kiếm 1 vị trí cụ thể trong 1 file, thậm chí bạn còn có thể đọc file dưới dạng luồng các ký tự hoặc byte.
+StreamReader: lớp này được thừa kế từ lớp TextReader, có chức năng để đọc đầu vào ký tự hoặc chuỗi từ trong một file. Lớp này chứa các phương thức để chỉ đọc các ký tự, khóa các ký tự, thậm chí toàn bộ file vào một biến chuỗi đơn.
+StreamWriter: được thừa kế từ lớp TextWriter, có công dụng để ghi đầu vào ký tự hoặc chuỗi cho một file. Lớp này chứa các phương thức để chỉ ghi các ký tự hoặc dòng các ký tự.
+BinaryReader: có công dụng để đọc các kiểu dữ liệu gốc – bao gồm byte,char vào trong một file. Lớp này chứa các phương thức để đọc bất kỳ kiểu dữ liệu gốc nào (int,long,float,…) gồm cả các các mảng char và các mảng byte.
+BinaryWriter: có công dụng để ghi các kiểu dữ liệu gốc – bao gồm byte,char vào trong một file. Lớp này chứa các phương thức để ghi bất kỳ kiểu dữ liệu gốc nào (int,long,float,…) gồm cả các các mảng char và các mảng byte.

Sau đây là các ví dụ về sử dụng các stream kể trên:

-FileStream:

Mã: Chọn hết

  1. Imports System.IO
  2. Imports System.Text
  3.  
  4. Module Module1
  5.  
  6.     Sub Main()
  7.         'tao 1 file tạm
  8.         Dim tempFile As String = "C:\vidu.txt"
  9.         Dim fStream As FileStream = Nothing
  10.         Try
  11.             fStream = File.Open(tempFile, FileMode.Append)
  12.             Dim content As String = "Noi dung cua file"
  13.             Dim bytes As Byte() = Encoding.ASCII.GetBytes(content.ToCharArray())
  14.             fStream.Write(bytes, 0, bytes.Length)
  15.             fStream.Close()
  16.         Catch ex As Exception
  17.  
  18.         End Try
  19.     End Sub
  20.  
  21. End Module


-StreamReader:

Mã: Chọn hết

  1. Imports System.IO
  2. Imports System.Text
  3.  
  4. Module Module1
  5.  
  6.     Sub Main()
  7.         'tao 1 file tạm
  8.         Dim tempFile As String = "C:\vidu.txt"
  9.         Dim sReader As StreamReader = Nothing
  10.         Try
  11.             sReader = New StreamReader(tempFile)
  12.             Dim chars(64) As Char
  13.             sReader.Read(chars, 0, 64)
  14.             Dim charsFound As New String(chars)
  15.             Console.WriteLine("Nhung ky tu trong stream:{0}", charsFound)
  16.             sReader.Close()
  17.         Catch ex As Exception
  18.  
  19.         End Try
  20.     End Sub
  21.  
  22. End Module


-StreamWriter:

Mã: Chọn hết

  1. Imports System.IO
  2. Imports System.Text
  3.  
  4. Module Module1
  5.  
  6.     Sub Main()
  7.         'tao 1 file tạm
  8.         Dim tempFile As String = "C:\vidu.txt"
  9.         Dim sWriter As StreamWriter = Nothing
  10.         Try
  11.             sWriter = New StreamWriter(tempFile, True)
  12.             sWriter.WriteLine(" Noi Dung vua them vao ")
  13.             sWriter.Close()
  14.         Catch ex As Exception
  15.  
  16.         End Try
  17.     End Sub
  18.  
  19. End Module


-BinaryWriter:

Mã: Chọn hết

  1. Imports System.IO
  2. Imports System.Text
  3.  
  4. Module Module1
  5.  
  6.     Sub Main()
  7.         'tao 1 file tạm
  8.         Dim tempFile As String = "C:\vidu.txt"
  9.         Dim sWriter As New StreamWriter(tempFile)
  10.         Dim bWriter As BinaryWriter = Nothing
  11.         Dim pos As Long = 0
  12.         Dim so As Integer = 25
  13.         Try
  14.             bWriter = New BinaryWriter(sWriter.BaseStream)
  15.             pos = bWriter.Seek(0, SeekOrigin.End)
  16.             bWriter.Write(so)
  17.             sWriter.Close()
  18.             bWriter.Close()
  19.         Catch ex As Exception
  20.  
  21.         End Try
  22.     End Sub
  23.  
  24. End Module


-BinaryReader:

Mã: Chọn hết

  1. Imports System.IO
  2. Imports System.Text
  3.  
  4. Module Module1
  5.  
  6.     Sub Main()
  7.         'tao 1 file tạm
  8.         Dim tempFile As String = "C:\vidu.txt"
  9.         Dim sReader As New StreamReader(tempFile)
  10.         Dim bReader As BinaryReader = Nothing
  11.         Dim pos As Long = 0
  12.         Dim so As Integer
  13.         Try
  14.             bReader = New BinaryReader(sReader.BaseStream)
  15.             For i As Integer = 0 To pos - 1
  16.                 bReader.ReadByte()
  17.             Next
  18.             so = bReader.ReadInt32()
  19.             Console.WriteLine(so)
  20.             sReader.Close()
  21.             bReader.Close()
  22.         Catch ex As Exception
  23.  
  24.         End Try
  25.     End Sub
  26.  
  27. End Module
SIMPLY THE BEST - ĐƠN GIẢN LÀ TỐT NHẤT

neverland87
Guru
Guru
Bài viết: 490
Ngày tham gia: T.Bảy 26/05/2007 4:31 pm
Been thanked: 8 time

Re: Các giải pháp làm việc với hệ thống tập tin trong .NET

Gửi bàigửi bởi neverland87 » T.Ba 10/06/2008 8:24 am

Giải pháp 6
Xuất một ký tự kết dòng EOL (end of line) độc lập với nền


Vấn đề: ứng dụng của bạn sẽ chạy trên nhiều nền. Mỗi nền sử dụng một ký tự kết dòng khác nhau. Bạn muốn mã lệnh xuất ra ký tự kết dòng chính xác mà không phải viết mã xử lý ký tự này một cách riêng biệt cho từng nền.

Giải pháp:
.NET cung cấp hằng Environment.NewLine, vốn trình bày một newline (chuỗi dòng mới) trên nền đã cho. Đây là chuỗi dòng mới được sử dụng bên trong bởi tất cả phương thức WriteLine mà .NET hỗ trợ.

Có một số trường hợp có thể sử dụng:

1.Định dạng một khối văn bản với các chuỗi dòng mới được nhúng vào nó:

Mã: Chọn hết

  1. Imports System.IO
  2.  
  3. Module Module1
  4.  
  5.     Sub Main()
  6.         Dim line = String.Format("First Line {0}Second Line {0}Third Line {0}", Environment.NewLine)
  7.         Dim fileName As String = "C:\vidu.txt"
  8.         Dim fStream As FileStream = File.Create(fileName)
  9.         Dim bytes As Byte() = System.Text.Encoding.Unicode.GetBytes(line)
  10.         fStream.Write(bytes, 0, bytes.Length)
  11.         fStream.Close()
  12.     End Sub
  13.  
  14. End Module


2.Bạn cần sử dụng một ký tự dòng mới khác thay cho ký tự mặc định được sử dụng bởi StreamWriter. Bạn có thể xác lập chuỗi dòng mới mà một StreamWriter sẽ sử dụng một lần, để tất cả phương thức WriteLine được thực hiện bởi một lớp StreamWriter sử dụng chuỗi dòng mới đó thay vì phải thực hiện bằng tay mỗi lần

Mã: Chọn hết

  1. Imports System.IO
  2.  
  3. Module Module1
  4.  
  5.     Sub Main()
  6.         Dim line As String = "Double spaced line"
  7.         Dim fileName As String = "C:\vidu.txt"
  8.         Dim sWriter As New StreamWriter(fileName)
  9.         sWriter.NewLine = Environment.NewLine + Environment.NewLine
  10.         sWriter.WriteLine(line)
  11.         sWriter.WriteLine(line)
  12.         sWriter.WriteLine(line)
  13.         sWriter.Close()
  14.     End Sub
  15.  
  16. End Module


Kết quả:

Mã: Chọn hết

  1. Double spaced line
  2.  
  3. Double spaced line
  4.  
  5. Double spaced line
SIMPLY THE BEST - ĐƠN GIẢN LÀ TỐT NHẤT

neverland87
Guru
Guru
Bài viết: 490
Ngày tham gia: T.Bảy 26/05/2007 4:31 pm
Been thanked: 8 time

Re: Các giải pháp làm việc với hệ thống tập tin trong .NET

Gửi bàigửi bởi neverland87 » T.Tư 11/06/2008 12:54 pm

Giải pháp 7
Đọc nội dung từ một file


Vấn đề: bạn cần tạo 1 file có thể ghi nhật ký thông tin vào hoặc lưu trữ thông tin tạm thời.

Giải pháp:
Muốn tạo, ghi và đọc từ một file, ta sẽ sử dụng lớp FileStream và các lớp đầu đọc (reader) và ghi (writer) của nó. Ta thử tạo 1 phương thức để cho phép khởi dựng, ghi và đọc từ một file log. Ví dụ:

Mã: Chọn hết

  1. Public Function CreateLogFile(ByVal logFileName As String) As System.IO.FileStream
  2.     Dim fStream As System.IO.FileStream = New FileStream(logFileName, FileMode.Open, FileAccess.ReadWrite, FileShare.None)
  3.     Return fStream
  4. End Function


Lúc này, file được tạo ra và dữ liệu được ghi vào trong nó. Để đọc nội dung của file vừa tạo, ta thử tạo phương thức lấy nội dung của file, sử dụng lớp StreamReader:

Mã: Chọn hết

  1. Public Function ReadContentFile(ByVal fStream As FileStream) As String
  2.     If Not fStream.CanRead Then
  3.         Dim fileName As String = fStream.Name
  4.         fStream.Close()
  5.         fStream = New FileStream(fileName, FileMode.Open, FileAccess.Read)
  6.     End If
  7.     Dim sReader As New StreamReader(fStream)
  8.     Dim contents As String = sReader.ReadToEnd()
  9.     sReader.Close()
  10.     Return contents
  11. End Function


Phương thức ReadToEnd() của lớp StreamReader cho phép ta lấy hết tả nội dung trên các dòng trong tập tin. Nếu bạn muốn đọc từng dòng thì sử dụng phương thức Peek.

Mã: Chọn hết

  1. Public Sub ReadContentFile_Peek(ByVal fStream As FileStream)
  2.     If Not fStream.CanRead Then
  3.         Dim fileName As String = fStream.Name
  4.         fStream.Close()
  5.         fStream = New FileStream(fileName, FileMode.Open, FileAccess.Read)
  6.     End If
  7.     Console.WriteLine("Noi dung cua tap tin:")
  8.     Dim sReader As New StreamReader(fStream)
  9.     While sReader.Peek() <> -1
  10.         Console.WriteLine(sReader.ReadLine())
  11.     End While
  12.     sReader.Close()
  13. End Sub


Nếu bạn cần đọc từng ký tự của file dưới dạng một giá trị byte, hãy sử dụng phương thức Read:

Mã: Chọn hết

  1. Public Sub ReadContentFile_ReadMethod(ByVal fStream As FileStream)
  2.     If Not fStream.CanRead Then
  3.         Dim fileName As String = fStream.Name
  4.         fStream.Close()
  5.         fStream = New FileStream(fileName, FileMode.Open, FileAccess.Read)
  6.     End If
  7.     Console.WriteLine("Noi dung cua tap tin:")
  8.     Dim sReader As New StreamReader(fStream)
  9.     While sReader.Peek() <> -1
  10.         Console.Write(sReader.Read())
  11.     End While
  12.     sReader.Close()
  13. End Sub


Phương thức này hiển thị giá trị byte, thay vì các ký tự mà chúng ta đã trình bày. Ví dụ, chúng ta có tập tin có nội dung sau:

Mã: Chọn hết

  1. Day la dong dau tien
  2. 2008
  3. Day la dong thu ba


Kết quả:

Noi dung cua tap tin:

Mã: Chọn hết

  1. 68971213210897321001111101033210097117321161051011101310504848561310689712132108
  2. 973210011111010332116104117329897


Nếu bạn cần đọc file theo nhiều khúc ngắn, tạo và điền vào một buffer một kích thước tùy ý dựa vào yêu cầu về sự thực thi.

Mã: Chọn hết

  1. Public Sub ReadAllBufferdFile(ByVal fStream As FileStream)
  2.     If Not fStream.CanRead Then
  3.         Dim fileName As String = fStream.Name
  4.         fStream.Close()
  5.         fStream = New FileStream(fileName, FileMode.Open, FileAccess.Read)
  6.     End If
  7.     Console.WriteLine("Noi dung cua tap tin:")
  8.     Dim sReader As New StreamReader(fStream)
  9.     While sReader.Peek() <> -1
  10.         Dim buffer As Char() = New Char(9) {}
  11.         Dim bufferFillSize As Integer = sReader.Read(buffer, 0, 10)
  12.         For Each c As Char In buffer
  13.             Console.Write(c)
  14.         Next
  15.         Console.WriteLine(bufferFillSize)
  16.     End While
  17.     sReader.Close()
  18. End Sub


Với tập tin có nội dung như trên, ta sẽ có kết quả:

Mã: Chọn hết

  1. Noi dung cua tap tin:
  2. Day la don10
  3. g dau tien10
  4.  
  5. 2008
  6. Da10
  7. y la dong 10
  8. thu ba    6
SIMPLY THE BEST - ĐƠN GIẢN LÀ TỐT NHẤT

nhaque
Thành viên chính thức
Thành viên chính thức
Bài viết: 36
Ngày tham gia: T.Hai 19/07/2010 4:32 pm

Re: Các giải pháp làm việc với hệ thống tập tin trong .NET

Gửi bàigửi bởi nhaque » T.Sáu 13/05/2011 11:49 am

Anh ơi cho em hỏi một chút được không ah
Em có 1 hàm với input là 1 FileStream, Integer. em dùng cái Readbyte để học từng byte ra 1 biến kiểu byte thì bị lỗi là tràn cái gì ấy anh ah em đã dùng kiểu integer rồi nhưng nó vẫn báo tràn. anh co thể giúp em dc không anh
  1. Public Function showMess(ByVal instream As FileStream, ByVal length As Integer) As Byte()
  2.         Dim hideMess As Byte() = New Byte(length - 1) {} 'Kieu byte ko co Constructors
  3.         Dim i As Integer = 0
  4.         Dim j As Integer = 0
  5.         Dim bit As Byte
  6.         Dim byteRead As Byte
  7.         Do While i < length
  8.             byteRead = (instream.ReadByte()) '' em đổi kiểu byte hay integer đề báo lỗi
  9.             ' Lấy ra bit tại vị trí 0 của byte ảnh
  10.             bit = Extract(byteRead, 0)
  11.             ' Đưa bit đó vào vị trí thứ j của hideMess(i)
  12.             Replace(hideMess(i), j, bit)
  13.             j += 1
  14.             byteRead = 0
  15.             If j = 8 Then
  16.                 j = 0
  17.                 i += 1
  18.             End If
  19.         Loop
  20.  
  21.         Return hideMess
  22.     End Function
  23.  


Quay về “[.NET] Hệ thống - Tập tin - Thư mục và Mạng”

Đang trực tuyến

Đang xem chuyên mục này: Không có thành viên nào trực tuyến.1 khách