在UWP中使用CreateFileAsync分配StorageFile时出错

时间:2018-08-21 15:43:07

标签: c# uwp windows-10-universal

我因使用UWP制作文本文件而受苦。 我已经体验了如何在UWP中制作文本文件。

但是当我尝试拥有自己的程序时,创建文件时遇到了一些问题。我不知道从哪里来。我缺乏有关C#类p的知识吗?或滥用内置类(例如storageFile等)的功能?

我制作了我的应用程序以从设备读取文件并另存为另一个文件。

但它根本不起作用。

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

Picture1. outputFile is setted as a null

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

下面的

是我的处理我的ClassType的源代码。当遇到FileIO.WriteTextAsync ...时它将停止,因为i.outPutFile为null。

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;
    }

在“上载的类”中(您只能看到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#类语法还是...什么?

1 个答案:

答案 0 :(得分:0)

感谢所有对我的信息发表评论的人。 我拼命试图找出问题所在,我遇到了。我仔细阅读了您的评论,我认为您的建议绝对是好的。

但是我遇到的问题是直接同步,非同步问题。我用了5个多小时来解决这个问题,发现类的成员函数setOutfile具有异步函数“ StorageFoder.CreateFileAsync”,当机器读取该语句时,它异步创建并开始编写一些文本(在处理程序类中实现)甚至没有创建。

...在myType类中,我将成员函数的类型从异步void更改为异步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;
    }

而且有效,谢谢大家。