在 UWP 中使用 CreateFileAsync 分配 StorageFile 时出错
Error with assign StorageFile with CreateFileAsync in UWP
我为使用 UWP 制作文本文件而苦恼。
我体验过如何在UWP中制作文本文件。
但是当我尝试创建自己的程序时,我在创建文件时遇到了一些问题。我不知道是哪里的原因。我缺乏关于 C# 的知识 class p?或滥用内置 Class(如 storageFile 等...)功能?
我让我的应用程序从设备读取文件并另存为另一个文件。
但它根本不起作用。
当我使用断点找出问题所在时。
Picture1. outputFile is setted as a null
您可以看到 i.outputFile(类型 StorageFile)设置为空。但按照我的意图,它不应该保留为空。
因为我用名为 "setOutFile(StorageFolder)" 的成员函数设置了它的(我的)outputFile。你可以在上图中看到。
下面是处理我的 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;
}
已上传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# Class 语法或...什么?
谢谢大家,对我的帖子发表评论的人。
我拼命想弄清楚是什么问题,我遇到了。我仔细阅读了您的评论,我认为您的建议绝对是好的。
但我遇到的问题是,坦率地说,同步、异步很重要。我在这个问题上挣扎了5个多小时,我发现class的成员函数setOutfile有异步函数"StorageFoder.CreateFileAsync",当机器读到那个语句时,它异步创建并开始写一些文本(在处理程序 class 中实现)它甚至没有创建。
...在 myType Class 中,我将成员函数的类型从 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);
}
}
然后在处理程序 class 成员函数中,我只是在 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;
}
成功了,谢谢大家。
我为使用 UWP 制作文本文件而苦恼。 我体验过如何在UWP中制作文本文件。
但是当我尝试创建自己的程序时,我在创建文件时遇到了一些问题。我不知道是哪里的原因。我缺乏关于 C# 的知识 class p?或滥用内置 Class(如 storageFile 等...)功能?
我让我的应用程序从设备读取文件并另存为另一个文件。
但它根本不起作用。
当我使用断点找出问题所在时。
Picture1. outputFile is setted as a null
您可以看到 i.outputFile(类型 StorageFile)设置为空。但按照我的意图,它不应该保留为空。 因为我用名为 "setOutFile(StorageFolder)" 的成员函数设置了它的(我的)outputFile。你可以在上图中看到。
下面是处理我的 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;
}
已上传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# Class 语法或...什么?
谢谢大家,对我的帖子发表评论的人。 我拼命想弄清楚是什么问题,我遇到了。我仔细阅读了您的评论,我认为您的建议绝对是好的。
但我遇到的问题是,坦率地说,同步、异步很重要。我在这个问题上挣扎了5个多小时,我发现class的成员函数setOutfile有异步函数"StorageFoder.CreateFileAsync",当机器读到那个语句时,它异步创建并开始写一些文本(在处理程序 class 中实现)它甚至没有创建。
...在 myType Class 中,我将成员函数的类型从 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);
}
}
然后在处理程序 class 成员函数中,我只是在 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;
}
成功了,谢谢大家。