首页 > 解决方案 > 在 UWP 中使用 CreateFileAsync 分配 StorageFile 时出错

问题描述

我为使用 UWP 制作文本文件而苦恼。我体验过如何在 UWP 中制作文本文件。

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

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

但它根本不起作用。

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

图片1。outputFile 设置为空

你可以看到 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");

我的应用程序使用已编辑的构造函数创建文件,但其中没有数据。

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

标签: c#uwpwindows-10-universal

解决方案


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

但我遇到的问题是,直截了当,同步,异步的事情。我在这个问题上挣扎了 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;
    }

它有效,谢谢大家。


推荐阅读