C# Can';无法从新创建的包含内容的文件中读取
我正在努力获取文件的总和。C# Can';无法从新创建的包含内容的文件中读取,c#,C#,我正在努力获取文件的总和。 当程序启动时,调用方法GetSHA256FromStream。 调用File.Open时,方法GetSHA256中出现错误。 我以管理员身份运行Visual Studio 错误: System.IO.IOException:'进程无法访问文件'C:\Users\WS1\AppData\Local\Temp\test.ttttt',因为它正在运行 由另一个进程使用。” 我真的不知道是否需要使用async/await来处理文件。 public static str
当程序启动时,调用方法
GetSHA256FromStream
。调用
File.Open
时,方法GetSHA256
中出现错误。我以管理员身份运行Visual Studio 错误:
System.IO.IOException:'进程无法访问文件
'C:\Users\WS1\AppData\Local\Temp\test.ttttt'
,因为它正在运行 由另一个进程使用。” 我真的不知道是否需要使用async/await来处理文件。
public static string GetSHA256FromStream(Stream s)
{
string _tpath = Helper.GetTEMPPath("test.ttttt"); // %TEMP%\\test.ttttt
Helper.WriteStreamToFile(s, _tpath);
return Checksum.GetSHA256(_tpath, true);
}
public async static void WriteStreamToFile(Stream s, string outpath)
{
try
{
FileStream fStream = File.Open(outpath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.Read);
s.Seek(0, SeekOrigin.Begin);
await s.CopyToAsync(fStream);
fStream.Close();
}
catch (Exception e)
{
return;
}
}
public static string GetSHA256(string text, bool isFile = false)
{
SHA256 sha256 = SHA256.Create();
byte[] hash;
if (isFile)
{
FileStream stream = File.OpenRead(text);
hash = sha256.ComputeHash(stream);
}
else
{
byte[] textBytes = Encoding.Default.GetBytes(text);
hash = sha256.ComputeHash(textBytes);
}
return BitConverter.ToString(hash).Replace("-", "").ToLowerInvariant();
}
方法
writeStreamFile
是async
,但您不能在GetSHA256FromStream
中等待它。因此,您已经在调用GetSHA256()
并试图打开该文件,而writeStreamFile
仍在写入
例如,您可以使GetSHA256FromStream
也异步,然后等待写入文件,然后在该任务完成后计算校验和
顺便说一句,您不应该在async
方法上返回void
,而应该返回任务
public static async Task<string> GetSHA256FromStream(Stream s)
{
try {
string _tpath = Helper.GetTEMPPath("test.ttttt"); // %TEMP%\\test.ttttt
await Helper.WriteStreamToFile(s, _tpath);
return Checksum.GetSHA256(_tpath, true);
}
catch (Exception e) {
//some error logging
}
}
public async static Task WriteStreamToFile(Stream s, string outpath)
{
try
{
FileStream fStream = File.Open(outpath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.Read);
s.Seek(0, SeekOrigin.Begin);
await s.CopyToAsync(fStream);
fStream.Close();
}
catch (Exception e)
{
//Don't use empty catches but log some error here
}
}
公共静态异步任务GetSHA256FromStream(流s)
{
试一试{
字符串_tpath=Helper.GetTEMPPath(“test.ttttt”);//%TEMP%\\test.ttttt
等待帮助程序。写入工作流文件(s,\t路径);
返回Checksum.GetSHA256(_-tpath,true);
}
捕获(例外e){
//一些错误记录
}
}
公共异步静态任务WriteStreamFile(流s、字符串输出路径)
{
尝试
{
FileStream fStream=File.Open(输出路径,FileMode.OpenOrCreate,FileAccess.ReadWrite,FileShare.Read);
s、 Seek(0,SeekOrigin.Begin);
等待s.CopyToAsync(fStream);
fStream.Close();
}
捕获(例外e)
{
//不要使用空捕获,但在此处记录一些错误
}
}
方法writeStreamFile
是异步的
,但您不会在GetSHA256FromStream
中等待它。因此,您已经在调用GetSHA256()
并试图打开该文件,而writeStreamFile
仍在写入
例如,您可以使GetSHA256FromStream
也异步,然后等待写入文件,然后在该任务完成后计算校验和
顺便说一句,您不应该在async
方法上返回void
,而应该返回任务
public static async Task<string> GetSHA256FromStream(Stream s)
{
try {
string _tpath = Helper.GetTEMPPath("test.ttttt"); // %TEMP%\\test.ttttt
await Helper.WriteStreamToFile(s, _tpath);
return Checksum.GetSHA256(_tpath, true);
}
catch (Exception e) {
//some error logging
}
}
public async static Task WriteStreamToFile(Stream s, string outpath)
{
try
{
FileStream fStream = File.Open(outpath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.Read);
s.Seek(0, SeekOrigin.Begin);
await s.CopyToAsync(fStream);
fStream.Close();
}
catch (Exception e)
{
//Don't use empty catches but log some error here
}
}
公共静态异步任务GetSHA256FromStream(流s)
{
试一试{
字符串_tpath=Helper.GetTEMPPath(“test.ttttt”);//%TEMP%\\test.ttttt
等待帮助程序。写入工作流文件(s,\t路径);
返回Checksum.GetSHA256(_-tpath,true);
}
捕获(例外e){
//一些错误记录
}
}
公共异步静态任务WriteStreamFile(流s、字符串输出路径)
{
尝试
{
FileStream fStream=File.Open(输出路径,FileMode.OpenOrCreate,FileAccess.ReadWrite,FileShare.Read);
s、 Seek(0,SeekOrigin.Begin);
等待s.CopyToAsync(fStream);
fStream.Close();
}
捕获(例外e)
{
//不要使用空捕获,但在此处记录一些错误
}
}
将FileStream创建放在using块中,这样可以确保正确的关闭和处理。它似乎已经打开了。正如信息所暗示的那样!在运行GetSHA256
之前,请确保关闭该文件。如果您没有看到在计算机上打开的文件,则可能需要检查操作系统当前打开的句柄或重新启动。请更改WriteStreamFile
以返回任务
,然后在GetSHA256FromStream
中等待该任务完成(您必须将其更改为异步)。或者,使用s.CopyTo(fStream);
确保在方法返回之前完成。更改为s.CopyTo(fStream)
也可以工作。将FileStream创建放在using块中,这样可以确保正确的关闭和处理。它似乎已经打开了。正如消息所示!请确保在运行GetSHA256
之前关闭该文件。如果您没有在comp上看到打开的文件,则可能需要检查操作系统当前打开的句柄或重新启动您可以更改writeStreamFile
以返回任务
,并等待它在GetSHA256FromStream
中完成(也必须更改为异步)。或者,使用s.CopyTo(fStream);
以确保它在方法返回之前完成。更改为s.CopyTo(fStream)
也可以。谢谢你的意见,但是校验和。GetSHA256
不返回任务,所以它不会工作,我想。@XYZT你试过了吗?如果GetSHA256
返回一个字符串,并且GetSHA256FromStream
返回一个任务,它会工作的……哦,任务,这是缺少的部分,抱歉。@XYZT老实说:我也错过了第一版答案中的那部分…:)谢谢你的意见,但是校验和。GetSHA256
不会返回任务,所以它不会工作,我想。@XYZT你试过了吗?如果GetSHA256
返回一个string
和GetSHA256FromStream
返回一个任务
它会工作的…哦,任务,这是缺少的部分,抱歉。@XYZT老实说,我在第一个版本的答案中也遗漏了那部分…)