Silverlight - การเข้าถึงไฟล์

ในบทนี้เราจะดูว่าแอปพลิเคชัน Silverlight สามารถเข้าถึงไฟล์บนคอมพิวเตอร์ของผู้ใช้ปลายทางได้อย่างไร มีสามวิธีหลักในการเข้าถึงไฟล์ใน Silverlight ตัวเลือกจะขึ้นอยู่กับเหตุผลที่คุณต้องใช้ไฟล์และขึ้นอยู่กับว่าคุณกำลังเขียนแอปพลิเคชันที่เชื่อถือได้หรือไม่

  • ตัวเลือกที่ยืดหยุ่นที่สุดคือการใช้ไฟล์ file dialogชั้นเรียน กับOpen และ Saveไดอะล็อกไฟล์คุณสามารถเข้าถึงไฟล์ใดก็ได้ที่ผู้ใช้เลือกตราบใดที่ผู้ใช้มีสิทธิ์ที่เหมาะสม ความยินยอมของผู้ใช้เป็นหัวใจสำคัญของแนวทางนี้ ผู้ใช้ต้องเลือกไฟล์ที่จะอ่านหรือเมื่อบันทึกพวกเขาจะเลือกไฟล์ที่จะเขียนทับหรือเลือกตำแหน่งและชื่อไฟล์ให้คุณ

  • ตัวเลือกที่สองคือการใช้คลาสต่างๆในไฟล์ System.IOเนมสเปซ Silverlight มีคลาสเช่นFileStream, StreamWriter, FileInfo, Directory, และ DirectoryInfoซึ่งทั้งหมดนี้ทำให้สามารถเขียนโค้ดที่เปิดและเข้าถึงไฟล์ได้โดยไม่จำเป็นต้องให้ผู้ใช้เข้ามาเกี่ยวข้อง สิ่งนี้อาจสะดวกกว่าสำหรับนักพัฒนา แต่แน่นอนว่าผู้ใช้ส่วนใหญ่ไม่ต้องการให้โค้ดเก่า ๆ ที่ดาวน์โหลดมาเป็นส่วนหนึ่งของหน้าเว็บเพื่อให้สามารถค้นหาในไฟล์ได้

  • ตัวเลือกที่สามคือ Isolated Storageซึ่งเราจะพูดถึงในภายหลัง

เปิดและบันทึกไฟล์โต้ตอบ

SaveFileDialog

SaveFileDialog คลาสแสดงส่วนต่อประสานผู้ใช้ที่ให้มาสำหรับระบบปฏิบัติการมาตรฐานสำหรับการเลือกตำแหน่งที่จะบันทึกไฟล์

คุณสมบัติที่สำคัญบางประการ ได้แก่ -

  • ในการใช้งานเราสร้างอินสแตนซ์ของไฟล์ SaveFileDialog ชั้นเรียน

  • โทร ShowDialogทำให้ปรากฏขึ้นและรหัสส่งคืนจะบอกเราว่าผู้ใช้เลือกสถานที่ที่จะบันทึกไฟล์หรือยกเลิกกล่องโต้ตอบ

  • คุณอาจสงสัยเกี่ยวกับการเปรียบเทียบที่ดูซ้ำซ้อนกับ Trueนั่นเอง ถ้าShowDialog ผลตอบแทน Trueค่าซึ่งหมายความว่าผู้ใช้ได้เลือกไฟล์ ดังนั้นเราสามารถโทรไปที่ไฟล์OpenFile วิธีการที่ส่งกลับมาให้เรา Stream.

  • หากเราต้องการเราสามารถค้นพบชื่อที่ผู้ใช้เลือก กล่องโต้ตอบให้คุณสมบัติที่เรียกว่าSafeFileNameแต่ไม่รวมถึงเส้นทาง ไม่ว่าในกรณีใดวิธีเดียวในการเขียนข้อมูลคือใช้ไฟล์Streamส่งคืนโดยกล่องโต้ตอบ จากมุมมองของนักพัฒนานี่เป็นเพียงเรื่องธรรมดา.NET streamเราจึงสามารถห่อเป็นไฟล์ StreamWriterเพื่อเขียนข้อความลงไป

OpenFileDialog

OpenFileDialog คล้ายกับการใช้งานไฟล์ SaveFileDialog. เห็นได้ชัดว่าคุณมักจะเลือกไฟล์ที่มีอยู่แทนที่จะเป็นไฟล์ใหม่ แต่มีข้อแตกต่างที่สำคัญอีกประการหนึ่ง

  • มีคุณสมบัติที่เรียกว่า MultiSelect. หากคุณตั้งค่าเป็นTrueผู้ใช้สามารถเลือกไฟล์ได้หลายไฟล์ ซึ่งหมายความว่ากล่องโต้ตอบต้องการ API ที่ซับซ้อนขึ้นเล็กน้อย

  • SaveFileDialog จัดการกับไฟล์ทีละไฟล์เท่านั้น แต่ OpenFileDialog สามารถรับมือกับสิ่งต่างๆได้มากขึ้นดังนั้นจึงไม่มี OpenFileวิธี. เราจำเป็นต้องขยายโค้ด ขึ้นอยู่กับว่ากล่องโต้ตอบอยู่ในsingle file โหมดหรือ MultiSelect คุณใช้โหมดใดก็ได้ File, หรือ Files ทรัพย์สิน.

  • ในตัวอย่างด้านล่างนี้เราอยู่ในโหมดไฟล์เดียว ดังนั้นเราจึงใช้Fileและเราโทร OpenRead บน FileInfo วัตถุที่ส่งคืน

  • ใน multiselect เราจะใช้ Files แทนซึ่งส่งกลับคอลเล็กชันของ FileInfo วัตถุ

FileStream

แนวทางที่สองในการ file access ดังที่ได้กล่าวมาแล้วคือการใช้ไฟล์ FileStream คลาสหรือประเภทที่เกี่ยวข้องในไฟล์ System.IOเนมสเปซโดยตรง ไม่มีอะไรจะพูดเกี่ยวกับเรื่องนี้มากนักเพราะส่วนใหญ่แล้วมันคล้ายกับการเข้าถึงไฟล์แบบเต็ม.NET Framework.

อย่างไรก็ตามมีการบิดเฉพาะของ Silverlight สองสามอย่าง

  • ขั้นแรกวิธีนี้ช่วยให้คุณเข้าถึงไฟล์ได้ตลอดเวลาโดยไม่ต้องมีการแทรกแซงของผู้ใช้และไม่มีการบ่งชี้กิจกรรมของไฟล์ที่ชัดเจนให้ใช้เฉพาะแอปพลิเคชันที่เชื่อถือได้เท่านั้นที่สามารถใช้เทคนิคนี้ได้ จำไว้ว่าคุณต้องใช้เบราว์เซอร์เพื่อให้ได้รับความไว้วางใจที่สูงขึ้น

  • ปัญหาที่สองคือมีเฉพาะไฟล์ในบางโฟลเดอร์เท่านั้น คุณสามารถอ่านและเขียนไฟล์ที่อยู่ภายใต้ไฟล์User's Documents, Music, Pictures, or Video files. เหตุผลหนึ่งคือ Silverlight ทำงานบนหลายแพลตฟอร์มและโครงสร้างระบบไฟล์สำหรับ Apple Mac นั้นแตกต่างจาก Windows มาก ดังนั้นการเข้าถึงไฟล์ข้ามแพลตฟอร์มจึงต้องทำงานในแง่ของชุดโฟลเดอร์ที่ จำกัด ซึ่งมีอยู่ในทุกระบบที่ Silverlight รองรับ

  • เนื่องจากโฟลเดอร์เหล่านี้จะอยู่ในตำแหน่งที่แตกต่างกันในระบบปฏิบัติการที่แตกต่างกันและโดยทั่วไปตำแหน่งที่ตั้งของโฟลเดอร์เหล่านี้จะแตกต่างกันไปในแต่ละผู้ใช้คุณจึงต้องใช้ Environment.GetFolderPath วิธีค้นหาตำแหน่งจริงที่รันไทม์

  • คุณสามารถตรวจสอบโครงสร้างไดเร็กทอรีใต้จุดเริ่มต้น Directory และ DirectoryInfo ชั้นเรียนใน System.IO เนมสเปซช่วยให้คุณสามารถระบุไฟล์และไดเร็กทอรี

ลองพิจารณาตัวอย่างง่ายๆที่ไฟล์สามารถเปิดผ่าน OpenFileDialog และบันทึกข้อความบางส่วนลงในไฟล์ผ่าน SaveFileDialog.

ด้านล่างคือรหัส XAML ซึ่งมีสองปุ่มและปุ่ม text box ถูกสร้างขึ้น

<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>

ให้ด้านล่างนี้คือรหัส C # สำหรับการใช้งานเหตุการณ์คลิกที่เปิดและบันทึกไฟล์

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(); 
               } 
            } 
         }  
      } 
   } 
}

เมื่อรวบรวมและดำเนินการโค้ดด้านบนคุณจะเห็นหน้าเว็บต่อไปนี้ซึ่งมีปุ่มสองปุ่ม

คลิก Open ซึ่งจะเปิดขึ้น OpenFileDialog เพื่อเลือกไฟล์ข้อความ

เลือกไฟล์ข้อความแล้วคลิก Openคุณจะเห็นข้อความบนกล่องข้อความ

หากต้องการบันทึกข้อความลงในไฟล์ให้อัปเดตข้อความ

คลิก Save เพื่อบันทึกการเปลี่ยนแปลงไฟล์ข้อความใหม่หรือไฟล์ที่มีอยู่

หากต้องการบันทึกการเปลี่ยนแปลงไฟล์ข้อความที่มีอยู่ให้เลือกไฟล์ข้อความในรูปแบบ SaveFileDialogแต่ถ้าคุณต้องการบันทึกการเปลี่ยนแปลงไฟล์ใหม่ให้เขียนชื่อไฟล์และคลิกที่ไฟล์ Save ปุ่ม.