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จากนั้นจะพิมพ์จำนวนโควต้าที่มีอยู่

เราขอแนะนำให้คุณดำเนินการตามตัวอย่างข้างต้นเพื่อความเข้าใจที่ดีขึ้น