C# UWP中使用CreateFileAsync分配StorageFile时出错

C# UWP中使用CreateFileAsync分配StorageFile时出错,c#,uwp,windows-10-universal,C#,Uwp,Windows 10 Universal,我用UWP制作文本文件很痛苦。 我曾经体验过如何在UWP中创建文本文件 但当我试图制作自己的程序时,我在创建文件时遇到了一些问题。我不知道原因是什么。我对C#p类知识的缺乏?或误用内置类(如storageFile等)功能 我让我的应用程序从设备读取文件并另存为另一个文件 但它根本不起作用 当我使用断点来找出问题所在时 您可以看到i.outputFile(StorageFile类型)被设置为null。但根据我的意图,它不应该保持为空。 因为我使用名为“setOutFile(StorageFold

我用UWP制作文本文件很痛苦。 我曾经体验过如何在UWP中创建文本文件

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

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

但它根本不起作用

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

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

下面是我处理类类型的源代码。当遇到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;
    }
它几乎不会在目标目录中创建具有指定文件名的文件。但是里面没有数据!!!。。。。。我尝试了下面的源代码,但其中也没有数据

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


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

谢谢大家,对我的帖子发表评论的朋友们。 我拼命想弄清楚问题出在哪里,我遇到了。我仔细阅读了你的评论,我认为你的建议绝对是好的

但我遇到的问题,直截了当地说,是同步、异步的事情。我花了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);
        }

    }
公共异步任务setOutFile(StorageFolder文件夹)
{
var rand=new Random();
string charset=“0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZABCDFGHIJKLMNOPQRSTUVWXYZ”;
StringBuilder结果=新的StringBuilder(13);

对于(int i=0;iuwp在用户设备上有有限数量的位置,您可以在其中写入文件,请确保您的应用程序可以访问您尝试写入的位置,如果您尝试在允许的文件夹之外写入,您的应用程序将获得“访问被拒绝”exception@touseefbsb但是,目录只是桌面上的一个文件夹(我用FolderPicker获得)。桌面文件夹不允许用于UWP应用程序吗?即使我将文件夹设置为“StorageFolder folder=Windows.ApplicationModel.Package.Current.InstalledLocation;”这不起作用啊哈,那么问题似乎不是权限,是其他原因造成的问题,是的,当你用folderpicker获得一些东西时,它是允许运行应用程序的,但一般来说,桌面文件夹是不允许为uwp编写的。这里提供了很多辅助代码。只测试fil可能会有所帮助e在不同的测试项目中编写部分。您可能还希望从官方平台上下拉并测试FileAccess上的示例,这些示例演示了如何将数据写入文件。请特别参阅和。我的问题与您的不同。我正在下载一个文件并将其保存在应用程序的本地文件夹中。但它确实存在无法正常工作,应用程序在创建文件时被卡住。我的返回类型是Task,我将其更改为Task,然后它开始工作。谢谢
await FileIO.WriteTextAsync(i.outputFile, "constant String");
 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);
        }

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