【问题标题】:Error with assign StorageFile with CreateFileAsync in UWP在 UWP 中使用 CreateFileAsync 分配 StorageFile 时出错
【发布时间】:2018-08-21 15:43:07
【问题描述】:

我在使用 UWP 制作文本文件时遇到了麻烦。 我体验过如何在 UWP 中制作文本文件。

但是当我尝试制作自己的程序时,我在创建文件时遇到了一些问题。不知道哪里来的原因。我对 C# 类 p 缺乏了解?还是滥用内置类(如 storageFile 等)功能?

我让我的应用程序从设备读取文件并保存为另一个文件。

但它根本不起作用。

当我使用断点找出问题所在时。

Picture1. outputFile is setted as a null

您可以看到 i.outputFile(type StorageFile) 设置为空。但按照我的意图,它不应该保持为空。 因为我使用名为“setOutFile(StorageFolder)”的成员函数设置了它的(我的)输出文件。你可以在上图中看到。

下面是处理我的 ClassType 的源代码。它在遇到 FileIO.WriteTextAsync 时停止...因为 i.outPutFile 为空。

public async Task<List<string>> DoRandom(FileLists fl, StorageFolder folder)
    {
        FileLists retLists = new FileLists();
        List<string> encodingList = new List<string>();

        foreach (UploadedFile i in fl)
        {
            // read stream from storagefile
            Stream s = await i.originFile.OpenStreamForReadAsync(); 

            // streamreader from stream
            StreamReader sr = new StreamReader(s, Encoding.ASCII);

            i.setOutFile(folder);
            if (sr.CurrentEncoding == Encoding.ASCII)
            {
                encodingList.Add("ASCII   " + i.outputName);
            }
            string str = await sr.ReadToEndAsync();
            StringBuilder stringBuilder = new StringBuilder(str);

            if (Option1)
            {
                doOption1(stringBuilder);
            }
            await FileIO.WriteTextAsync(i.outputFile, stringBuilder.ToString());
            if (Option1);
        };
        return encodingList;
    }

在 Uploaded Class 中(你可以看到 setOutFile 函数)。

 class UploadedFile
{
    public StorageFile originFile;
    public StorageFile outputFile { get; set; }

    public string inputName {get; private set; }
    public string outputName {get; private set; }
    public string fileSz{get; private set;}

    public UploadedFile(StorageFile storageFile)
    {
        originFile = storageFile;
        inputName = storageFile.Name;
    }

    public async Task GetFileSz()
    {
        var bp = await originFile.GetBasicPropertiesAsync();
        this.fileSz = string.Format("{0:n0} Byte", bp.Size);
    }

    public async void setOutFile(StorageFolder folder)
    {
        var rand = new Random();
        string charset = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
        StringBuilder result = new StringBuilder(13);

        for (int i=0; i<13; i++)
        {
            result.Append(charset[rand.Next(charset.Length)]);
        }
        StringBuilder outputName = new StringBuilder();

        outputName.Append(inputName.Substring(0, inputName.Length - 4));
        outputName.Append("_");
        outputName.Append(result);
        outputName.Append(".txt");
        this.outputName = outputName.ToString();

        outputFile = await folder.CreateFileAsync(outputName.ToString(), CreationCollisionOption.ReplaceExisting);

        for (int i = 0; i <= 10000; i++) // break point
            i++;
    }

当我在构造函数中插入一个赋值(下面)时。

outputFile = storageFile;

它几乎不会在目标目录中创建一个带有指定文件名的文件。但是里面没有数据!!!.....我试过下面的源代码,但里面也没有数据。

await FileIO.WriteTextAsync(i.outputFile, "constant String");

my app makes file with edited constructor, but it has no data in it.

我不知道我的问题是什么,C# 类语法还是...什么?

【问题讨论】:

  • uwp 在用户设备上的位置数量有限,您可以在其中写入文件,使您尝试写入的位置可访问您的应用程序,如果您尝试在允许的文件夹之外写入,您的应用程序将获得“访问被拒绝”异常
  • @touseefbsb 但是,该目录只是桌面中的一个文件夹(我用 FolderPicker 得到它)。 UWP App 不允许使用 Desktop 文件夹吗?
  • 即使我将文件夹设置为“ StorageFolder folder = Windows.ApplicationModel.Package.Current.InstalledLocation;” 它也不起作用
  • ahan 那么问题似乎不是权限,是其他原因导致的问题,是的,当您使用 folderpicker 获得某些东西时,它允许运行该应用程序,但一般来说桌面文件夹是不允许的为uwp写作。
  • 这里提供了很多辅助代码。在不同的测试项目中仅测试文件写入部分可能会有所帮助。您可能还想从官方平台示例中提取并测试 FileAccess 上的示例,这些示例展示了如何将数据写入文件。尤其是ApplicationDataFileAccess

标签: c# uwp windows-10-universal


【解决方案1】:

感谢所有对我的帖子发表评论的人。 我拼命想弄清楚是什么问题,我遇到了。我仔细阅读了您的 cmets,我认为您的建议绝对是好的。

但我遇到的问题是,直截了当,同步,异步的事情。我在这个问题上挣扎了 5 个多小时,我发现类的成员函数 setOutfile 具有异步函数“StorageFoder.CreateFileAsync”,当机器读取该语句时,它异步创建并开始编写一些文本(在处理程序类中实现)即使它没有被创建。

...在 myType 类中,我将成员函数的类型从 async void 更改为 async Task。

 public async Task setOutFile(StorageFolder folder)
    {
        var rand = new Random();
        string charset = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
        StringBuilder result = new StringBuilder(13);

        for (int i=0; i<13; i++)
        {
            result.Append(charset[rand.Next(charset.Length)]);
        }
        StringBuilder outputName = new StringBuilder();

        outputName.Append(inputName.Substring(0, inputName.Length - 4));
        outputName.Append("_");
        outputName.Append(result);
        outputName.Append(".txt");
        this.outputName = outputName.ToString();

        if (folder != null)
        {
            outputFile = await folder.CreateFileAsync(outputName.ToString(), CreationCollisionOption.ReplaceExisting);
        }

    }

然后在处理程序类成员函数中,我只是在 i.setOutFile(StorageFolder ..) 之前添加了 await 关键字

       public async Task<List<string>> DoRandom(FileLists fl, StorageFolder folder)
    {
        FileLists retLists = new FileLists();
        List<string> encodingList = new List<string>();

        foreach (UploadedFile i in fl)
        {
            // read stream from storagefile
            Stream s = await i.originFile.OpenStreamForReadAsync(); 

            // streamreader from stream
            StreamReader sr = new StreamReader(s, Encoding.ASCII);

            await i.setOutFile(folder) ; // wait until setOutFile ends
            if (sr.CurrentEncoding == Encoding.ASCII)
            {
                encodingList.Add("ASCII   " + i.outputName);
            }
            string str = await sr.ReadToEndAsync();
            StringBuilder stringBuilder = new StringBuilder(str);

            if (Option1)
            {
                doOption1(stringBuilder);
            }
            await FileIO.WriteTextAsync(i.outputFile, stringBuilder.ToString());
            if (Option1);
        };
        return encodingList;
    }

它有效,谢谢大家。

【讨论】:

  • 我的问题和你的不同。我正在下载一个文件并将其保存在应用程序的本地文件夹中。但它不能正常工作,应用程序在创建文件时卡住了。我的返回类型是 Task ,我将其更改为 Task 然后它开始工作。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-22
  • 1970-01-01
  • 1970-01-01
  • 2019-11-09
  • 1970-01-01
  • 2019-06-28
相关资源
最近更新 更多