Silverlight - ที่เก็บข้อมูลแยก
กลไกการเข้าถึงไฟล์ที่สามคือ Isolated Storageกลไกซึ่งจัดเตรียมพื้นที่เก็บข้อมูลที่เกี่ยวข้องกับผู้ใช้ที่ล็อกอิน API นำเสนอข้อมูลผ่านไฟล์Stream คลาสจาก .NET System.IOเนมสเปซ ดังนั้นเช่นเดียวกับกลไกอื่น ๆ ที่เราได้ดูไปแล้วคุณสามารถใช้ประเภทอื่น ๆ ในSystem.IO เพื่อทำงานกับสตรีมทำให้คุณสามารถจัดเก็บข้อมูลที่เป็นข้อความหรือข้อมูลไบนารี
คุณสมบัติที่สำคัญบางประการ ได้แก่ -
กลไกการจัดเก็บนี้เรียกว่า Isolated Storage เนื่องจากร้านค้าถูกแบ่งพาร์ติชันและแอปพลิเคชัน Silverlight สามารถเข้าถึงได้เฉพาะบางส่วนเท่านั้น
คุณไม่สามารถเข้าถึงข้อมูลเก่าที่เก็บไว้ได้ ก่อนอื่นร้านค้าจะแบ่งพาร์ติชันต่อผู้ใช้ แอปพลิเคชัน Silverlight ไม่สามารถเข้าถึงร้านค้าสำหรับผู้ใช้อื่นนอกเหนือจากที่ลงชื่อเข้าใช้และเรียกใช้แอปพลิเคชัน
สิ่งนี้ไม่เกี่ยวข้องกับกลไกการระบุตัวตนใด ๆ ที่เว็บแอปพลิเคชันของคุณอาจใช้ นั่นเป็นจุดสำคัญที่ต้องจำเพราะบางคนที่ใช้คอมพิวเตอร์ร่วมกันไม่ได้กังวลกับบัญชี Windows ที่แยกจากกันและคุ้นเคยกับการลงชื่อเข้าใช้และออกจากเว็บไซต์ที่พวกเขาใช้เท่านั้น
การใช้ที่เก็บข้อมูลแบบแยก
พื้นที่จัดเก็บแบบแยกไม่ได้เป็นของ Silverlight เดิมเปิดตัว API สำหรับWindows Formsเพื่อเปิดใช้งานแอปพลิเคชันที่เรียกใช้จากเว็บเพื่อจัดเก็บข้อมูลในเครื่องในสถานการณ์ความน่าเชื่อถือบางส่วน การใช้งานแตกต่างกันและไม่มีวิธีใดในการเข้าถึงแบบเต็ม.NET ที่เก็บข้อมูลที่แยกได้ของ Framework จาก Silverlight หรือในทางกลับกัน
อย่างไรก็ตามหากคุณเคยใช้ขั้นตอนที่นี่จะดูคุ้นเคยมาก
คุณเริ่มต้นด้วยการขอร้านค้าเฉพาะผู้ใช้ ในกรณีนี้เรากำลังขอใบสมัคร หากเราต้องการให้ร้านค้าต่อไซต์แชร์โดย XAP ทั้งหมดบนไซต์เราจะโทรGetUserStoreForSite แทน.
วิธีใดวิธีหนึ่งจะส่งคืนไฟล์ IsolatedStorageFile ออบเจ็กต์ซึ่งเป็นชื่อที่ไม่เป็นประโยชน์เนื่องจากนี่แสดงถึงไดเร็กทอรีไม่ใช่ไฟล์
ในการเข้าถึงไฟล์คุณต้องถามไฟล์ IsolatedStorageFile สำหรับ Stream.
เราใช้ไฟล์ IsolatedStorageFileStream คลาสและตัวสร้างต้องการให้คุณผ่านไฟล์ IsolatedStorageFile วัตถุเป็นอาร์กิวเมนต์
ดังนั้นเราจึงสร้างไฟล์ใหม่ในสโตร์ ไม่ทราบตำแหน่งที่แน่นอนของไฟล์บนดิสก์
ไดเร็กทอรีที่บรรจุมีองค์ประกอบแบบสุ่มเพื่อให้ไม่สามารถคาดเดาชื่อของไฟล์ได้
หากไม่มีสิ่งนี้อาจเป็นไปได้ที่เว็บไซต์ที่เป็นอันตรายจะวางไฟล์บนคอมพิวเตอร์ของผู้ใช้จากนั้นสร้าง URL ของไฟล์เพื่อเปิดโดยหวังว่าจะหลอกให้ผู้ใช้คลิกลิงก์ที่เรียกใช้โปรแกรมในเครื่อง
มีการป้องกันอื่น ๆ อีกมากมายใน Windows ที่พยายามป้องกันไม่ให้สิ่งนี้เกิดขึ้น แต่นี่เป็นการป้องกันอีกชั้นหนึ่งในกรณีที่คนอื่นถูกปิดใช้งานหรือข้ามไป
ไฟล์จะถูกเก็บไว้ที่ใดที่หนึ่งในโปรไฟล์ของผู้ใช้ แต่นั่นก็มากเท่าที่คุณจะรู้ได้ ของคุณIsolatedStorageFileStream จะไม่รายงานตำแหน่งที่แท้จริง
ให้เราดูตัวอย่างง่ายๆที่ติดตามว่ามีการเรียกใช้แอปพลิเคชันกี่ครั้ง ระบุด้านล่างคือรหัส XAML
<UserControl x:Class = "StoreRunCount.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">
<TextBlock x:Name = "runCountText" FontSize = "20" />
</Grid>
</UserControl>
นี่คือรหัส C # ที่ Isolated storage ใช้
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.IO.IsolatedStorage;
using System.IO;
namespace StoreRunCount {
public partial class MainPage : UserControl {
const string RunCountFileName = "RunCount.bin";
public MainPage() {
InitializeComponent();
int runCount = 0;
using (var store = IsolatedStorageFile.GetUserStoreForApplication()) {
if (store.FileExists(RunCountFileName)) {
using (var stm = store.OpenFile(RunCountFileName,
FileMode.Open, FileAccess.Read))
using (var r = new BinaryReader(stm)) {
runCount = r.ReadInt32();
}
}
runCount += 1;
using (var stm = store.OpenFile(RunCountFileName,
FileMode.Create, FileAccess.Write))
using (var w = new BinaryWriter(stm)) {
w.Write(runCount);
}
}
runCountText.Text = "You have run this application " + runCount.ToString() + " time(s)";
}
}
}
เมื่อรวบรวมและดำเนินการโค้ดด้านบนคุณจะเห็นหน้าเว็บต่อไปนี้ซึ่งจะแสดงให้คุณเห็นว่าคุณเรียกใช้แอปพลิเคชันนี้กี่ครั้ง
เพิ่มโควต้าของคุณ
แอปพลิเคชันอาจขอพื้นที่เพิ่มหากจำนวนเริ่มต้นไม่เพียงพอด้วยเหตุผลบางประการ ไม่มีการรับประกันว่าคำขอจะสำเร็จ Silverlight จะถามผู้ใช้ว่าพวกเขายินดีที่จะเพิ่มพื้นที่ให้แอปพลิเคชันหรือไม่
อย่างไรก็ตามคุณได้รับอนุญาตให้ขอพื้นที่เก็บข้อมูลเพิ่มเติมเพื่อตอบสนองต่อการป้อนข้อมูลของผู้ใช้เท่านั้นเช่นไฟล์ click. หากคุณพยายามถามในเวลาอื่นเช่นเมื่อปลั๊กอินโหลดหรือในตัวจัดการตัวจับเวลา Silverlight จะล้มเหลวในคำขอโดยอัตโนมัติโดยไม่ต้องแจ้งให้ผู้ใช้ทราบ โควต้าพิเศษมีให้เฉพาะแอปพลิเคชันที่ผู้ใช้โต้ตอบเท่านั้น
IsolatedStorageFile วัตถุมีสมาชิกสามคนสำหรับการจัดการโควต้า -
- AvailableFreeSpace
- IncreaseQuotaTo
- Quota
ว่าง
คุณสมบัติ AvailableFreeSpace จะบอกคุณว่าโควต้าของคุณยังคงว่างอยู่เท่าใด
โปรดทราบว่าแม้แต่ไดเร็กทอรีย่อยที่ว่างเปล่าก็ยังใช้โควต้าบางส่วนของคุณเนื่องจากระบบปฏิบัติการจำเป็นต้องจัดสรรพื้นที่บนดิสก์เพื่อเป็นตัวแทนของไดเร็กทอรี ดังนั้นพื้นที่ว่างอาจน้อยกว่าโควต้าทั้งหมดลบด้วยขนาดรวมของไฟล์ทั้งหมดของคุณ
เพิ่ม QuotaTo
หากคุณไม่มีพื้นที่เพียงพอในการดำเนินการคุณสามารถสอบถามเพิ่มเติมได้โดยโทรไปที่ไฟล์ IncreaseQuotaTo วิธี.
โควต้า
ที่นี่เรากำลังใช้คุณสมบัติที่สาม Quotaเพื่อค้นหาขนาดโควต้าปัจจุบันจากนั้นเรากำลังเพิ่มจำนวนเงินพิเศษที่เราต้องการเพื่อรับโควต้าที่ร้องขอใหม่ของเรา
วิธีนี้จะส่งกลับอย่างใดอย่างหนึ่ง True หรือ Falseเพื่อระบุว่าเราได้รับการจัดสรรสิ่งที่ขอหรือไม่ โปรดทราบว่า Silverlight อาจตัดสินใจจัดสรรพื้นที่มากกว่าที่คุณขอ
นี่คือตัวอย่างง่ายๆในการเพิ่มไฟล์ quotaเมื่อคลิกปุ่ม ระบุด้านล่างคือรหัส XAML
<UserControl x:Class = "ChangeQuota.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">
<TextBlock x:Name = "infoText" FontSize = "20" TextWrapping = "Wrap" />
<Button x:Name = "increaseQuota" Content = "Increase" HorizontalAlignment = "Center"
FontSize = "20"
VerticalAlignment = "Center" Click = "increaseQuota_Click" />
</Grid>
</UserControl>
นี่คือการใช้งาน click เหตุการณ์ที่โควต้าเพิ่มขึ้น
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.IO.IsolatedStorage;
namespace ChangeQuota {
public partial class MainPage : UserControl {
public MainPage() {
InitializeComponent();
}
private void increaseQuota_Click(object sender, RoutedEventArgs e) {
using (IsolatedStorageFile isoStore =
IsolatedStorageFile.GetUserStoreForApplication()) {
long newQuota = isoStore.Quota + 10240;
if (isoStore.IncreaseQuotaTo(newQuota)) {
infoText.Text = "Quota is " + isoStore.Quota + ", free space: " +
isoStore.AvailableFreeSpace;
} else {
infoText.Text = "Meanie!";
}
}
}
}
}
เมื่อโค้ดด้านบนถูกคอมไพล์และดำเนินการคุณจะเห็นผลลัพธ์ต่อไปนี้
เมื่อคุณคลิก Increaseพรอมต์จะปรากฏขึ้น มันขอให้เพิ่มQuota จะมีขนาดใหญ่กว่า 10KB ที่มีอยู่แล้ว
เมื่อคุณคลิก Yesจากนั้นจะพิมพ์จำนวนโควต้าที่มีอยู่
เราขอแนะนำให้คุณดำเนินการตามตัวอย่างข้างต้นเพื่อความเข้าใจที่ดีขึ้น