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 ปุ่ม.