在 DocumentsLibrary 中创建一个文件

Creating a file inside DocumentsLibrary

我创建了一个应用程序,将用户数据保存到 xml 文件中,我希望该 xml 文件位于文档库中。 该应用程序是在 PCL 中创建的,但我的主要目标是 UWP 设备 (phone)。我为此使用了 DependencyService,因为 PCL 中没有 System.IO.FileStream。

所以我在 PCL:

中点击创建文件
private void Senden_Clicked(object sender, EventArgs e)
        {
            var s = DependencyService.Get<IFileHelper>().MakeFileStream();
            StreamWriter sw = new StreamWriter(s, Encoding.UTF8);
            XMLDaten xmldat = new XMLDaten(); //Seriazable Class
            XmlSerializer serializer = new XmlSerializer(typeof(XMLDaten));
            serializer.Serialize(sw, xmldat);
            s.Dispose();
        }

这是我在UWP项目中创建的class:

namespace myProject.UWP
{
    public class FileHelper: IFileHelper
    {
        public FileHelper() { }

        public Stream MakeFileStream()
        {
            StorageFolder sf = KnownFolders.DocumentsLibrary;
            var path = sf.Path;
            FileStream fileStream = new FileStream(@path + "\daten.xml", FileMode.OpenOrCreate, FileAccess.ReadWrite);
            return fileStream;
        }
    }
}

这是我创建的界面(位于名为 classes 的文件夹中):

namespace myProject.classes
{

    public interface  IFileHelper
    {
        Stream MakeFileStreamAsync();

    }
}

不幸的是 DocumentsLibrary returns 一个空路径。我该如何解决这个问题?我看过一些示例,但没有任何示例可以让应用程序变得如此简单而无需使用任务和异步 classes。在你问之前,是的,我已经在 Package.appxManifest 中添加了 DocumentsLibrary 功能并添加了所需的扩展,因此可以将文件写入文档库。

如果已经有 Capabilities 则只需添加以下行:

<uap:Capability Name="documentsLibrary" />

而且,这还不是全部。接下来你需要告诉它它可以访问哪些文档:

  <Extensions>
    <uap:Extension Category="windows.fileTypeAssociation">
      <uap:FileTypeAssociation Name=".txt">
        <uap:DisplayName>Text</uap:DisplayName>
        <uap:SupportedFileTypes>
          <uap:FileType>.jpg</uap:FileType>
          <uap:FileType>.txt</uap:FileType>
          <uap:FileType>.gif</uap:FileType>
          <uap:FileType>.doc</uap:FileType>
          <uap:FileType>.xls</uap:FileType>
          <uap:FileType>.xml</uap:FileType>
        </uap:SupportedFileTypes>
      </uap:FileTypeAssociation>
    </uap:Extension>
  </Extensions>

Unfortunately DocumentsLibrary returns an empty path.

由于 DocumentsLibrary 是代表不同位置和文件集合的虚拟位置,因此它没有路径。

In the Remarks of KnownFolders.DocumentsLibrary property, we can find that Libraries let users view related content in a single location. A library is a virtual folder. The folders in a library remain in their original locations. Learn more about libraries in Windows Libraries.

StorageFolder.Path 属性 可以获取当前文件夹在文件系统中的完整路径,但前提是该路径可用。由于音乐库是一个虚拟文件夹,文件系统路径不可用。所以它总是 returns 空字符串。

因为您已经有了 StorageFolder,所以用它来创建一个 StorageFile,然后使用其中一种方法从中获取流,例如:

 public IRandomAccessStream MakeFileStream()
  {
      var task = MakeFileStreamAsync();
      task.Wait();
      return task.Result;
  }

  public async Task<IRandomAccessStream> MakeFileStreamAsync()
  {
      StorageFolder sf = KnownFolders.DocumentsLibrary;

      var file = await sf.CreateFileAsync("daten.xml", CreationCollisionOption.OpenIfExists);

      using (var stream = await file.OpenAsync(FileAccessMode.ReadWrite))
      {
          return stream;
      }
  }