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老实说,我在第一个版本的答案中也遗漏了那部分…)