首页 > 代码库 > Win8.1应用开发之文件操作

Win8.1应用开发之文件操作

在操作文件之前,先对应用的应用功能声明进行设定。用户通过C#(非UI)对win8.1上的文件进行访问,只能局限于图片,音乐,视频和文档四个文件夹。而通过文件选取器则能访问到整个系统的文件。

(一)应用功能声明

对于win8应用商店应用,打开Package.appxmanifest文件,点击“功能”选项卡,勾选“音乐库”,“图片库”和“视频库”,这样你就可以通过代码对这里面的文件和文件夹进行操作:


音乐
musicLibrary 许可范围可提供对用户音乐的编程访问能力,让应用无需用户交互即可枚举和访问库中的所有文件。此许可范围通常用在需要访问整个音乐库的自动唱片点唱机应用中。
file picker 提供了一种强大的 UI 机制,让用户可以打开要通过某个应用处理的文件。 仅当应用需要进行编程访问,而使用 file picker 无法实现编程访问时,才应声明 musicLibrary 许可范围。


图片
picturesLibrary 许可范围可提供对用户图片的编程访问能力,让应用无需用户交互即可枚举和访问库中的所有文件。此许可范围通常用在需要访问整个图片库的照片播放应用中。
file picker 提供了一种强大的 UI 机制,让用户可以打开要通过某个应用处理的文件。 仅当应用需要进行编程访问,而使用 file picker 无法实现编程访问时,才应声明 picturesLibrary 许可范围。 


视频
videosLibrary 许可范围可提供对用户视频的编程访问能力,让应用无需用户交互即可枚举和访问库中的所有文件。此许可范围通常用在需要访问整个视频库的电影播放应用中。
file picker 提供了一种强大的 UI 机制,让用户可以打开要通过某个应用处理的文件。 仅当应用需要进行编程访问,而使用 file picker 无法实现编程访问时,才应声明 videosLibrary 许可范围。


对于“文档"文件夹的访问,要根据VS提供的出错信息进行自动设置,之后要设置文件关联,按照提示做即可。


(二)文件选取器

UI形式,可访问整个系统上的文件。使用文件选取器通过让用户选取文件和文件夹来访问文件和文件夹。你可以使用 FileOpenPicker 类获取对文件的访问,使用 FolderPicker 获取对文件夹的访问。通过文件选取器,你的应用可以在用户的整个系统上获得对文件和文件夹的访问。当你调用文件选取器时,用户可以浏览其系统并选择文件(或文件夹)以访问和保存。在用户选取文件或文件夹之后,你的应用将这些选取作为 StorageFile 和 StorageFolder 对象进行接收。接着你的应用可以通过使用这些对象在选取的文件和文件夹上操作。

if (rootPage.EnsureUnsnapped())
{
    FileOpenPicker openPicker = new FileOpenPicker();
    openPicker.ViewMode = PickerViewMode.Thumbnail;
    openPicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary;
    openPicker.FileTypeFilter.Add(".jpg");
    openPicker.FileTypeFilter.Add(".jpeg");
    openPicker.FileTypeFilter.Add(".png");

    StorageFile file = await openPicker.PickSingleFileAsync();
    if (file != null)
    {
        // Application now has read/write access to the picked file
        OutputTextBlock.Text = "Picked photo: " + file.Name;
    }
    else
    {
        OutputTextBlock.Text = "Operation cancelled.";
    }
}

(三)通过编程进行文件操作

类KnownFolders 提供对其中包含用户内容的常见位置的访问。 这包括用户的本地库(如照片、文档、音乐或视频)中的内容、可移动设备、家庭组以及媒体服务器设备。对于访问磁盘文件来说,这只局限于图片,音乐,文档和视频四个文件夹。

示例1:将服务器上的一个文件下载到“图片”文件夹下的一个子文件(需动态创建)中

 string dync_IPv4 = "211.87.237.23";
            string port = "8081";
            string UrlJsonPath = "json/Images.txt";
            //string UrlJsonPath = "Image/694021692/1214936171.png";
            string uri = "http://" + dync_IPv4 + ":" + port + "/" + UrlJsonPath;

            System.Diagnostics.Debug.WriteLine(uri);

            string filename = "ImagesUri.txt";
            //string filename = "DAXIA.png";

            var rass = RandomAccessStreamReference.CreateFromUri(new Uri(uri));
            IRandomAccessStream inputStream = await rass.OpenReadAsync();
            Stream input = WindowsRuntimeStreamExtensions.AsStreamForRead(inputStream.GetInputStreamAt(0));
          
            try
            {
                //获取图片扩展名的Guid
                StorageFolder folder = KnownFolders.PicturesLibrary;
                //System.Diagnostics.Debug.WriteLine(folder.Path);
                //Creates a new file in the current folder, and specifies what to do if a file with the same name already exists in the current folder.
                StorageFolder childFolder = await folder.CreateFolderAsync("WhereWeGo");
                StorageFile outputFile = await childFolder.CreateFileAsync(filename, CreationCollisionOption.ReplaceExisting);
                //StorageFile outputFile = await folder.CreateFileAsync(filename, CreationCollisionOption.ReplaceExisting);
                System.Diagnostics.Debug.WriteLine(outputFile.Path);
                using (IRandomAccessStream outputStream = await outputFile.OpenAsync(FileAccessMode.ReadWrite))
                {
                    Stream output = WindowsRuntimeStreamExtensions.AsStreamForWrite(outputStream.GetOutputStreamAt(0));
                    await input.CopyToAsync(output);
                    output.Dispose();
                    input.Dispose();
                }
            }
            catch (Exception)
            {
                System.Diagnostics.Debug.WriteLine("adfasd");
            }
 

示例2:接示例1,将下载的文件读出来

  // 在指定的目录下获取指定的文件
            StorageFolder storageFolder = KnownFolders.PicturesLibrary;
            StorageFolder folder = await storageFolder.GetFolderAsync("WhereWeGo");
            StorageFile storageFile = await folder.GetFileAsync("ImagesUri.txt");
           // StorageFile storageFile = await storageFolder.GetFileAsync("ImagesUri.txt");

            if (storageFile != null)
            {
                // 获取指定的文件中的文本内容
                string textContent = await FileIO.ReadTextAsync(storageFile, Windows.Storage.Streams.UnicodeEncoding.Utf8);
                System.Diagnostics.Debug.WriteLine(textContent);
            }