gpt4 book ai didi

c# - 文件流写入文件并读取 bfile

转载 作者:行者123 更新时间:2023-11-30 15:48:03 24 4
gpt4 key购买 nike

我有一个 Web 服务,它检查字典以查看文件是否存在,如果存在,则读取文件,否则保存到文件中。这是来自网络应用程序。我想知道执行此操作的最佳方法是什么,因为如果同时访问同一文件,我偶尔会遇到 FileNotFoundException 异常。以下是代码的相关部分:

String signature;
signature = "FILE," + value1 + "," + value2 + "," + value3 + "," + value4; // this is going to be the filename

string result;
MultipleRecordset mrSummary = new MultipleRecordset(); // MultipleRecordset is an object that retrieves data from a sql server database

if (mrSummary.existsFile(signature))
{
result = mrSummary.retrieveFile(signature);
}
else
{
result = mrSummary.getMultipleRecordsets(System.Configuration.ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString.ToString(), value1, value2, value3, value4);
mrSummary.saveFile(signature, result);
}

这是查看文件是否已经存在的代码:

private static Dictionary<String, bool> dict = new Dictionary<String, bool>();

public bool existsFile(string signature)
{
if (dict.ContainsKey(signature))
{
return true;
}
else
{
return false;
}
}

这是我用来检索它是否已存在的内容:

try
{

byte[] buffer;
FileStream fileStream = new FileStream(@System.Configuration.ConfigurationManager.AppSettings["CACHEPATH"] + filename, FileMode.Open, FileAccess.Read, FileShare.Read);
try
{
int length = 0x8000; // get file length
buffer = new byte[length]; // create buffer
int count; // actual number of bytes read
JSONstring = "";
while ((count = fileStream.Read(buffer, 0, length)) > 0)
{
JSONstring += System.Text.ASCIIEncoding.ASCII.GetString(buffer, 0, count);
}
}
finally
{
fileStream.Close();
}
}
catch (Exception e)
{

JSONstring = "{\"error\":\"" + e.ToString() + "\"}";
}

如果文件以前不存在,它会将 JSON 保存到文件中:

try 
{
if (dict.ContainsKey(filename) == false)
{
dict.Add(filename, true);
}
else
{
this.retrieveFile(filename, ipaddress);
}

}
catch
{


}


try
{
TextWriter tw = new StreamWriter(@System.Configuration.ConfigurationManager.AppSettings["CACHEPATH"] + filename);
tw.WriteLine(JSONstring);
tw.Close();
}
catch {

}

以下是我有时在运行上述代码时遇到的异常的详细信息:

System.IO.FileNotFoundException: Could not find file 'E:\inetpub\wwwroot\cache\FILE,36,36.25,14.5,14.75'.
File name: 'E:\inetpub\wwwroot\cache\FILE,36,36.25,14.5,14.75'
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy)
at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share)
at com.myname.business.MultipleRecordset.retrieveFile(String filename, String ipaddress)

最佳答案

你得到一个 FileNotFoundException因为您在实际写入文件之前将文件名添加到字典中。因此,对同一个文件的并发操作会导致此问题。

写入后将其添加到字典只会产生一个新问题:它会开始尝试同时写入文件(并且失败得很惨)。如果性能很重要,我会将我的字典更改为 Dictionary<string, object>并将该值用作文件级别的同步对象。您还需要添加一个单独的同步对象来检查和添加到字典本身。

但这可能有点矫枉过正,需要手动使用 Monitor.EnterMonitor.Exit .这是一个稍微简单的实现:

static HashSet<string> files = new HashSet<string>();
static object syncRoot = new object();

void Whatever(string filename, string ipaddress)
{
bool fileFound;

lock (syncRoot)
{
fileFound = files.Contains(filename);
if (!fileFound)
{
files.Add(filename);
// Code to write file here
}
}

if (fileFound)
{
retrieveFile(filename, ipaddress);
}
}

当写入完成时,性能会有点次优,因为它会阻塞所有读取操作,直到写入完成。但是,如果大多数操作都是读取操作,这就不是问题。

我已经把你的字典改成了 HashSet 在这个例子中,因为你似乎只使用键,而不是值。

关于c# - 文件流写入文件并读取 bfile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2999731/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com