Silverlight - Quyền truy cập tệp

Trong chương này, chúng ta sẽ xem cách các ứng dụng Silverlight có thể truy cập tệp trên máy tính của người dùng cuối. Có ba cách chính để truy cập tệp trong Silverlight. Sự lựa chọn sẽ phụ thuộc vào lý do bạn cần sử dụng tệp và liệu bạn có đang viết một ứng dụng đáng tin cậy hay không.

  • Tùy chọn linh hoạt nhất là sử dụng file dialogcác lớp học. VớiOpenSavehộp thoại tệp, bạn có thể có quyền truy cập vào bất kỳ tệp nào mà người dùng cuối chọn, miễn là người dùng có quyền thích hợp. Sự đồng ý của người dùng là trọng tâm của phương pháp này. Người dùng phải chọn tệp để đọc hoặc khi lưu, họ chọn tệp để ghi đè hoặc chọn vị trí và tên tệp cho bạn.

  • Tùy chọn thứ hai là sử dụng các lớp khác nhau trong System.IOkhông gian tên. Silverlight cung cấp các lớp học nhưFileStream, StreamWriter, FileInfo, Directory,DirectoryInfo, tất cả đều giúp bạn có thể viết mã mở và truy cập tệp mà không cần người dùng tham gia. Điều đó có thể thuận tiện hơn cho nhà phát triển, nhưng tất nhiên, hầu hết người dùng sẽ không muốn bất kỳ mã cũ nào được tải xuống dưới dạng một phần của trang web để có thể tìm kiếm trong tệp của họ.

  • Tùy chọn thứ ba là Isolated Storage, mà chúng ta sẽ thảo luận sau.

Hộp thoại Mở & Lưu Tệp

SaveFileDialog

Các SaveFileDialog lớp hiển thị giao diện người dùng được cung cấp hệ điều hành tiêu chuẩn để chọn nơi lưu tệp.

Một số tính năng quan trọng là -

  • Để sử dụng nó, chúng tôi tạo một phiên bản của SaveFileDialog lớp học.

  • Kêu gọi ShowDialog, khiến nó xuất hiện và mã trả về cho chúng tôi biết liệu người dùng đã chọn một nơi để lưu tệp hay đã hủy hộp thoại.

  • Bạn có thể tự hỏi về sự so sánh có vẻ thừa với Trueở đó. NếuShowDialog trả lại Truegiá trị, có nghĩa là người dùng đã chọn một tệp. Vì vậy, chúng tôi có thể tiếp tục gọiOpenFile phương thức này trả về cho chúng ta một Stream.

  • Nếu muốn, chúng tôi có thể khám phá tên mà người dùng đã chọn. Hộp thoại cung cấp một thuộc tính được gọi làSafeFileName, nhưng điều đó không bao gồm đường dẫn. Trong mọi trường hợp, cách duy nhất để ghi dữ liệu là sử dụngStreamtrả về bởi hộp thoại. Từ quan điểm của một nhà phát triển, đây chỉ là một.NET stream, vì vậy chúng tôi có thể bọc nó trong một StreamWriter, để viết văn bản vào đó.

OpenFileDialog

OpenFileDialog được sử dụng tương tự như SaveFileDialog. Rõ ràng, bạn luôn chọn một tệp hiện có hơn là một tệp mới, nhưng có một sự khác biệt quan trọng khác.

  • Nó cung cấp một thuộc tính được gọi là MultiSelect. Nếu bạn đặt nó thànhTrue, người dùng có thể chọn nhiều tệp. Điều này có nghĩa là hộp thoại cần một API phức tạp hơn một chút.

  • Các SaveFileDialog chỉ giao dịch với một tệp tại một thời điểm, nhưng OpenFileDialog có thể đối phó với nhiều hơn, vì vậy nó không cung cấp OpenFilephương pháp. Chúng tôi cần mở rộng mã. Tùy thuộc vào việc hộp thoại có ởsingle file chế độ, hoặc MultiSelect chế độ, bạn sử dụng File, hoặc là Files bất động sản.

  • Ở đây, trong ví dụ dưới đây, chúng tôi đang ở chế độ tệp đơn. Do đó, chúng tôi sử dụngFile, và chúng tôi gọi OpenRead trên FileInfo đối tượng trả về.

  • Trong multiselect chế độ, chúng tôi sẽ sử dụng Files thay vào đó, nó trả về một tập hợp FileInfo các đối tượng.

Tập hồ sơ

Cách tiếp cận thứ hai để file access như đã đề cập ở trên là sử dụng FileStream lớp hoặc các loại liên quan trong System.IOkhông gian tên trực tiếp. Không có nhiều điều để nói về điều này, bởi vì phần lớn, nó tương tự như truy cập tệp với đầy đủ.NET Framework.

Tuy nhiên, có một vài điểm xoắn đặc trưng cho Silverlight.

  • Đầu tiên, cách tiếp cận này cho phép bạn truy cập tệp bất kỳ lúc nào mà không cần sự can thiệp của người dùng và không có bất kỳ dấu hiệu rõ ràng nào về hoạt động tệp, chỉ những ứng dụng đáng tin cậy mới được phép sử dụng kỹ thuật này. Hãy nhớ rằng, bạn cần sử dụng trình duyệt để có được sự tin cậy cao.

  • Vấn đề thứ hai là chỉ có các tệp trong một số thư mục cụ thể. Bạn chỉ có thể đọc và ghi các tệp nằm trongUser's Documents, Music, Pictures, or Video files. Một lý do giải thích cho điều này là Silverlight chạy trên nhiều nền tảng và cấu trúc hệ thống tệp, chẳng hạn như máy Mac của Apple, rất khác với cấu trúc của Windows. Do đó, quyền truy cập tệp đa nền tảng phải hoạt động trong điều kiện một bộ thư mục hạn chế có sẵn trên tất cả các hệ thống mà Silverlight hỗ trợ.

  • Vì các thư mục này sẽ ở các vị trí khác nhau trên các hệ điều hành khác nhau và vị trí của chúng thường sẽ khác nhau từ người dùng này sang người dùng khác, bạn cần sử dụng Environment.GetFolderPath phương pháp để khám phá vị trí thực tế trong thời gian chạy.

  • Bạn có thể kiểm tra cấu trúc thư mục bên dưới điểm bắt đầu. CácDirectoryDirectoryInfo các lớp học trong System.IO không gian tên cho phép bạn liệt kê các tệp và thư mục.

Hãy xem xét một ví dụ đơn giản trong đó tệp có thể mở qua OpenFileDialog và lưu một số văn bản vào tệp qua SaveFileDialog.

Dưới đây là mã XAML trong đó có hai nút và text box được tạo ra.

<UserControl x:Class = "FileDialogs.MainPage" 
   xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
   xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml" 
   xmlns:d = "http://schemas.microsoft.com/expression/blend/2008" 
   xmlns:mc = "http://schemas.openxmlformats.org/markup-compatibility/2006" 
   mc:Ignorable = "d" 
   d:DesignHeight = "300" d:DesignWidth = "400"> 
   
   <Grid x:Name = "LayoutRoot" Background = "White">
	
      <Grid.RowDefinitions> 
         <RowDefinition Height = "Auto" /> 
         <RowDefinition Height = "265*" /> 
      </Grid.RowDefinitions>
		
      <Button 
         x:Name = "saveFileButton" 
         Content = "Save" 
         Width = "75" FontSize = "20" 
         HorizontalAlignment = "Left" VerticalAlignment = "Top" 
         Margin = "12,12" Click = "saveFileButton_Click" /> 
				
      <Button 
         x:Name = "openFileButton" 
         Content = "Open" 
         Width = "75" FontSize = "20" 
         HorizontalAlignment = "Left" VerticalAlignment = "Top" 
         Margin = "101,12,0,0" Click = "openFileButton_Click" /> 
				
      <TextBox 
         x:Name = "contentTextBox" 
         Grid.Row = "1" 
         Margin = "12" FontSize = "20" /> 
				
   </Grid> 
	
</UserControl>

Dưới đây là mã C # để triển khai các sự kiện nhấp chuột trong đó tệp được mở và lưu.

using System; 
using System.Diagnostics; 
using System.IO; 

using System.Windows; 
using System.Windows.Controls; 
 
namespace FileDialogs {

   public partial class MainPage : UserControl { 
	
      public MainPage() { 
         InitializeComponent(); 
      }
	  
      private void saveFileButton_Click(object sender, RoutedEventArgs e) { 
         var save = new SaveFileDialog(); 
         save.Filter = "Text Files (*.txt)|*.txt|All Files (*.*)|*.*"; 
         save.DefaultExt = ".txt"; 
			
         if (save.ShowDialog() == true) { 
            Debug.WriteLine(save.SafeFileName); 
            using (Stream saveStream = save.OpenFile()) 
            using (var w = new StreamWriter(saveStream)) { 
               var fs = saveStream as FileStream; 
					
               if (fs != null) { 
                  w.Write(contentTextBox.Text); 
               } 
            } 
         } 
      }
	  
      private void openFileButton_Click(object sender, RoutedEventArgs e) { 
         var open = new OpenFileDialog(); 
			
         if (open.ShowDialog() == true) { 
            using (Stream openStream = open.File.OpenRead()) { 
               using (var read = new StreamReader(openStream)) { 
                  contentTextBox.Text = read.ReadToEnd(); 
               } 
            } 
         }  
      } 
   } 
}

Khi đoạn mã trên được biên dịch và thực thi, bạn sẽ thấy trang web sau, có hai nút.

Nhấn vào Open nút này sẽ mở ra OpenFileDialog để chọn một tệp văn bản.

Chọn một tệp văn bản và nhấp vào Open, bạn sẽ thấy văn bản trên hộp văn bản.

Để lưu văn bản vào tệp, hãy cập nhật văn bản.

Nhấn vào Save để lưu các thay đổi vào tệp văn bản mới hoặc tệp hiện có.

Để lưu các thay đổi đối với tệp văn bản hiện có, hãy chọn tệp văn bản trong SaveFileDialog, nhưng nếu bạn muốn lưu các thay đổi vào tệp mới, hãy ghi tên tệp và nhấp vào Save cái nút.