不同凡響 windows phone (37) - 8.0 文件系統: StorageFolder, StorageFile, 經過 Uri 引用文件, 獲取 SD 卡中的文件

[源碼下載]


html

不同凡響 windows phone (37) - 8.0 文件系統: StorageFolder, StorageFile, 經過 Uri 引用文件, 獲取 SD 卡中的文件



做者:webabcd


介紹
不同凡響 windows phone 8.0 之 文件系統html5

  • 經過 StorageFolder 和 StorageFile 實現文件的讀寫
  • 經過 Uri 引用文件
  • 獲取 SD 卡中的內容



示例
一、演示如何經過 StorageFolder 和 StorageFile 實現文件的讀寫
FileSystem/ReadWriteDemo.xamlweb

<phone:PhoneApplicationPage
    x:Class="Demo.FileSystem.ReadWriteDemo"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    SupportedOrientations="Portrait" Orientation="Portrait"
    mc:Ignorable="d"
    shell:SystemTray.IsVisible="True">

    <Grid Background="Transparent">
        <StackPanel Orientation="Vertical">

            <TextBlock x:Name="lblMsg" />

            <Button x:Name="btnWrite" Content="寫文件" Click="btnWrite_Click" />

            <Button x:Name="btnRead" Content="讀文件" Click="btnRead_Click" />

        </StackPanel>
    </Grid>

</phone:PhoneApplicationPage>

FileSystem/ReadWriteDemo.xaml.csshell

/*
 * 演示如何經過 StorageFolder 和 StorageFile 實現文件的讀寫
 * 
 * 
 * StorageFolder - 用於文件夾的相關操做
 * StorageFile - 用於文件的相關操做
 * 
 * 注:wp8 中無 win8 中的 FileIO 幫助類,全部文件夾和文件的操做都集成到了 StorageFolder 和 StorageFile 內
 * 
 * 
 * wp8 的文件操做部分繼承了 win8,詳細信息請參見,本文再也不詳述
 * http://www.cnblogs.com/webabcd/archive/2013/04/25/3041569.html
 * http://www.cnblogs.com/webabcd/archive/2013/05/06/3062064.html
 * http://www.cnblogs.com/webabcd/archive/2013/05/09/3068281.html
 * 
 * wp7 的文件操做之前也寫過,詳細信息請參見
 * http://www.cnblogs.com/webabcd/archive/2012/06/20/2555653.html
 * http://www.cnblogs.com/webabcd/archive/2012/06/25/2560696.html
 * 
 * 
 * 另:本地存儲的資源管理器請參見
 * http://msdn.microsoft.com/zh-cn/library/windowsphone/develop/hh286408
 * http://wptools.codeplex.com/
 */

using System;
using System.Windows;
using Microsoft.Phone.Controls;
using Windows.Storage;
using System.IO;
using System.Text;
using Windows.Storage.Streams;

namespace Demo.FileSystem
{
    public partial class ReadWriteDemo : PhoneApplicationPage
    {
        public ReadWriteDemo()
        {
            InitializeComponent();
        }

        // 寫文件的 Demo
        private async void btnWrite_Click(object sender, RoutedEventArgs e)
        {
            // 獲取應用程序數據存儲文件夾
            StorageFolder applicationFolder = ApplicationData.Current.LocalFolder;

            // 在指定的應用程序數據存儲文件夾內建立指定的文件
            StorageFile storageFile = await applicationFolder.CreateFileAsync("webabcdTest.txt", CreationCollisionOption.ReplaceExisting);
            
            // 將指定的文本內容寫入到指定的文件
            using (Stream stream = await storageFile.OpenStreamForWriteAsync())
            {
                byte[] content = Encoding.UTF8.GetBytes(DateTime.Now.ToString());
                await stream.WriteAsync(content, 0, content.Length);
            }
        }

        // 讀文件的 Demo
        private async void btnRead_Click(object sender, RoutedEventArgs e)
        {
            // 獲取應用程序數據存儲文件夾
            StorageFolder applicationFolder = ApplicationData.Current.LocalFolder;

            StorageFile storageFile = null;

            try
            {
                // 在指定的應用程序數據存儲文件夾中查找指定的文件
                storageFile = await applicationFolder.GetFileAsync("webabcdTest.txt");
            }
            catch (System.IO.FileNotFoundException ex)
            {
                // 沒找到指定的文件
                lblMsg.Text = "沒有找到對應的文件";
            }

            // 獲取指定的文件的文本內容
            if (storageFile != null)
            {
                IRandomAccessStreamWithContentType accessStream = await storageFile.OpenReadAsync();

                using (Stream stream = accessStream.AsStreamForRead((int)accessStream.Size))
                {
                    byte[] content = new byte[stream.Length];
                    await stream.ReadAsync(content, 0, (int)stream.Length);

                    lblMsg.Text = Encoding.UTF8.GetString(content, 0, content.Length);
                }
            }
        }
    }
}


二、演示如何經過 Uri 引用文件,以及對各類文件路徑作簡要說明
FileSystem/UriDemo.xaml數據庫

<phone:PhoneApplicationPage
    x:Class="Demo.FileSystem.UriDemo"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    SupportedOrientations="Portrait" Orientation="Portrait"
    mc:Ignorable="d"
    shell:SystemTray.IsVisible="True">

    <Grid Background="Transparent">
        <StackPanel Orientation="Vertical">

            <TextBlock Name="lblMsg" TextWrapping="Wrap" />

            <Image Name="img1" Width="50" Height="50" Margin="0 5 0 0" />

            <Image Name="img2" Width="50" Height="50" Margin="0 5 0 0" />

            <Image Name="img3" Width="50" Height="50" Margin="0 5 0 0" />

            <Image Name="img4" Width="50" Height="50" Margin="0 5 0 0" />

            <Image Name="img5" Width="50" Height="50" Margin="0 5 0 0" />

        </StackPanel>
    </Grid>

</phone:PhoneApplicationPage>

FileSystem/UriDemo.xaml.csexpress

/*
 * 演示如何經過 Uri 引用文件,以及對各類文件路徑作簡要說明
 * 
 * 
 * 因爲引入了 win8 文件管理模型,因此 StorageFile 能夠支持 ms-appx:/// 和 ms-appdata:///local/(roaming 和 temp 不支持)
 */

using System;
using System.Windows;
using System.Windows.Navigation;
using Microsoft.Phone.Controls;
using System.Windows.Media.Imaging;
using Windows.Storage;
using System.IO;
using System.Windows.Resources;
using Windows.ApplicationModel;
using System.Threading.Tasks;
using System.IO.IsolatedStorage;

namespace Demo.FileSystem
{
    public partial class UriDemo : PhoneApplicationPage
    {
        public UriDemo()
        {
            InitializeComponent();
        }

        protected async override void OnNavigatedTo(NavigationEventArgs e)
        {
            // Package 內的文件管理
            await PackageDemo();

            // Application Data(只支持 LocalFolder,RoamingFolder 和 TemporaryFolder 目前都不支持)內的文件管理
            await ApplicationDataDemo();

            // Isolated Storage(其在 Application Data 的 Local\IsolatedStore\ 目錄下)內的文件管理
            IsolatedStorageDemo();

            // 本地數據庫
            DataContextDemo();

            base.OnNavigatedTo(e);
        }

        // 引用 Package 中的文件,介紹 Package 中的文件路徑
        private async Task PackageDemo()
        {
            // Package 所在路徑
            StorageFolder packageFolder = Package.Current.InstalledLocation;
            lblMsg.Text += "Package 路徑:" + packageFolder.Path;
            lblMsg.Text += Environment.NewLine;

            // 引用 Package 內的媒體類文件
            img1.Source = new BitmapImage(new Uri("/Assets/AppIcon.png", UriKind.Relative)); // 引用 Package 中的內容文件(此方式須要以「/」開頭)
            // img1.Source = new BitmapImage(new Uri("/Demo;component/Assets/AppIconResource.png", UriKind.Relative)); // 引用 Package 中的資源文件(須要以「/」開頭)

            // 經過 StreamResourceInfo 方式獲取 Package 內的文件
            StreamResourceInfo sri = Application.GetResourceStream(new Uri("Assets/AppIcon.png", UriKind.Relative)); // 引用 Package 中的內容文件(此方式不能以「/」開頭)
            // StreamResourceInfo sri = Application.GetResourceStream(new Uri("/Demo;component/Assets/AppIconResource.png", UriKind.Relative));  // 引用 Package 中的資源文件(須要以「/」開頭)
            Stream stream = sri.Stream;
            BitmapImage bi = new BitmapImage();
            bi.SetSource(stream);
            img2.Source = bi;

            // 經過 win8 方式獲取 Package 內的文件
            StorageFile imgFilePackage = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Assets/AppIcon.png", UriKind.Absolute));
            using (var sourceFile = await imgFilePackage.OpenStreamForReadAsync())
            {
                BitmapImage image = new BitmapImage();
                image.SetSource(sourceFile);
                img3.Source = image;
            }
        }

        private async Task ApplicationDataDemo()
        {
            // 從 Package 複製文件到 ApplicationData
            // 路徑爲:C:\Data\Users\DefApps\AppData\{ProductID}\Local\
            StorageFolder applicationFolder = ApplicationData.Current.LocalFolder; // 注:RoamingFolder 和 TemporaryFolder 目前都不支持
            StorageFile imgFilePackage = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Assets/AppIcon.png", UriKind.Absolute));
            await imgFilePackage.CopyAsync(applicationFolder, "AppIcon.png", NameCollisionOption.ReplaceExisting);

            // 獲取 ApplicationData 中的文件
            StorageFile imgFileApplicationData = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appdata:///Local/AppIcon.png", UriKind.Absolute));
            using (var sourceFile = await imgFileApplicationData.OpenStreamForReadAsync())
            {
                BitmapImage image = new BitmapImage();
                image.SetSource(sourceFile);
                img4.Source = image;
            }
        }

        private void IsolatedStorageDemo()
        {
            // 從 Package 複製文件到 IsolatedStorage
            // 路徑爲:C:\Data\Users\DefApps\AppData\{ProductID}\Local\IsolatedStore\
            IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication();
            using (Stream input = Application.GetResourceStream(new Uri("Assets/AppIcon.png", UriKind.Relative)).Stream)
            {
                using (IsolatedStorageFileStream output = isf.CreateFile("AppIcon.png"))
                {
                    byte[] readBuffer = new byte[4096];
                    int bytesRead = -1;

                    while ((bytesRead = input.Read(readBuffer, 0, readBuffer.Length)) > 0)
                    {
                        output.Write(readBuffer, 0, bytesRead);
                    }
                }
            }

            // 獲取 IsolatedStorage 中的文件
            using (var isfs = new IsolatedStorageFileStream(@"AppIcon.png", FileMode.OpenOrCreate, isf))
            {
                BitmapImage bi = new BitmapImage();
                bi.SetSource(isfs);
                img5.Source = bi;
            }
        }

        private void DataContextDemo()
        {
            // 引用 Package 中的數據庫文件用 appdata:/ 
            // 引用 IsolatedStorage 中的數據庫文件用 isostore:/ 

            // 關於本地數據庫的詳細信息請參見:http://www.cnblogs.com/webabcd/archive/2012/06/25/2560696.html
        }
    }
}


三、演示如何獲取 SD 卡中的內容
FileSystem/SDDemo.xamlwindows

<phone:PhoneApplicationPage
    x:Class="Demo.FileSystem.SDDemo"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    SupportedOrientations="Portrait" Orientation="Portrait"
    mc:Ignorable="d"
    shell:SystemTray.IsVisible="True">

    <Grid Background="Transparent">
        <StackPanel Orientation="Vertical">

            <TextBlock Name="lblMsg" TextWrapping="Wrap" />

            <Image Name="img1" Width="50" Height="50" Margin="0 5 0 0" />

            <Image Name="img2" Width="50" Height="50" Margin="0 5 0 0" />

            <Image Name="img3" Width="50" Height="50" Margin="0 5 0 0" />

            <Image Name="img4" Width="50" Height="50" Margin="0 5 0 0" />

            <Image Name="img5" Width="50" Height="50" Margin="0 5 0 0" />

            <Image Name="img6" Width="50" Height="50" Margin="0 5 0 0" />

            <Image Name="img7" Width="50" Height="50" Margin="0 5 0 0" />

            <Image Name="img8" Width="50" Height="50" Margin="0 5 0 0" />

        </StackPanel>
    </Grid>

</phone:PhoneApplicationPage>

FileSystem/SDDemo.xaml.csapp

/*
 * 演示如何獲取 SD 卡中的內容
 * 查看本 Demo 前須要如今 sd 卡根目錄下建立幾個文件夾和幾個有內容的 .log 文件
 * 
 * 
 * ExternalStorage - sd 存儲
 *     GetExternalStorageDevicesAsync() - 獲取 sd 存儲設備集合
 * 
 * ExternalStorageDevice - sd 存儲設備
 *     ExternalStorageID - 惟一標識
 *     RootFolder - 根目錄
 *     GetFolderAsync(string folderPath) - 獲取指定路徑的文件夾
 *     GetFileAsync(string filePath) - 獲取指定路徑的文件
 *     
 * ExternalStorageFolder - sd 存儲設備中的文件夾
 *     Name - 文件夾名稱
 *     Path - 文件夾路徑
 *     DateModified - 上次修改的日期
 *     GetFoldersAsync() - 獲取當前文件夾的頂級子文件夾列表
 *     GetFolderAsync(string name) - 獲取指定路徑的單個子文件夾
 *     GetFilesAsync() - 獲取當前文件夾內的頂級文件列表
 * 
 * ExternalStorageFile - sd 存儲設備中的文件
 *     Name - 文件名稱
 *     Path - 文件路徑
 *     DateModified - 上次修改的日期
 *     OpenForReadAsync() - 打開文件流以讀取文件
 *     
 * 
 * 注:
 * 一、對 sd 存儲的操做只有讀取的權限
 * 二、文件夾 Music, Pictures, Videos, WPSystem 中的內容沒法經過 ExternalStorage 獲取
 * 三、在 manifest 中增長配置 <Capability Name="ID_CAP_REMOVABLE_STORAGE" />
 * 四、在 manifest 中增長相似以下的配置
 *  <Extensions>
      <!--關於 FileTypeAssociation 詳見《關聯啓動》-->
      <FileTypeAssociation TaskID="_default" Name="myFileTypeAssociation" NavUriFragment="fileToken=%s">
        <Logos>
          <Logo Size="small" IsRelative="true">Assets/AppIcon_33x33.png</Logo>
          <Logo Size="medium" IsRelative="true">Assets/AppIcon_69x69.png</Logo>
          <Logo Size="large" IsRelative="true">Assets/AppIcon_176x176.png</Logo>
        </Logos>
        <SupportedFileTypes>
          <!--只能訪問此處聲明過的類型的文件-->
          <FileType ContentType="text/plain">.log</FileType>
          <FileType ContentType="application/rar">.rar</FileType>
        </SupportedFileTypes>
      </FileTypeAssociation>
    </Extensions>
 */

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Navigation;
using Microsoft.Phone.Controls;
using Microsoft.Phone.Storage;
using System.IO;

namespace Demo.FileSystem
{
    public partial class SDDemo : PhoneApplicationPage
    {
        public SDDemo()
        {
            InitializeComponent();
        }

        protected async override void OnNavigatedTo(NavigationEventArgs e)
        {
            // 獲取 sd 卡設備
            ExternalStorageDevice sdCard = (await ExternalStorage.GetExternalStorageDevicesAsync()).FirstOrDefault();

            if (sdCard != null)
            {
                try
                {
                    // 遍歷根目錄下的文件夾
                    ExternalStorageFolder rootFolder = sdCard.RootFolder;
                    IEnumerable<ExternalStorageFolder> folders = await rootFolder.GetFoldersAsync();
                    foreach (ExternalStorageFolder folder in folders)
                    {
                        lblMsg.Text += folder.Name;
                        lblMsg.Text += Environment.NewLine;
                    }

                    // 遍歷根目錄下的文件
                    IEnumerable<ExternalStorageFile> files = await rootFolder.GetFilesAsync();
                    foreach (ExternalStorageFile file in files)
                    {
                        lblMsg.Text += file.Name;
                        lblMsg.Text += Environment.NewLine;

                        // 獲取文件的內容
                        if (Path.GetExtension(file.Path) == ".log")
                            ReadFile(file);
                    }
                }
                catch (FileNotFoundException ex)
                {
                    MessageBox.Show("沒有找到相關的文件或文件夾");
                }
            }
            else
            {
                MessageBox.Show("沒有找到 sd 卡");
            }


            base.OnNavigatedTo(e);
        }

        private async void ReadFile(ExternalStorageFile file)
        {
            // 獲取文件的內容
            Stream stream = await file.OpenForReadAsync();
            using (StreamReader sr = new StreamReader(stream))
            {
                lblMsg.Text += sr.ReadToEnd();
                lblMsg.Text += Environment.NewLine;
            }
        }
    }
}



OK
[源碼下載]asp.net

相關文章
相關標籤/搜索