J'ai un service Web qui vérifie un dictionnaire pour voir si un fichier existe et s'il existe, il lit le fichier, sinon il enregistre dans le fichier. Ceci provient d'une application Web. Je me demande quelle est la meilleure façon de le faire parce que je reçois occasionnellement une exception FileNotFoundException si le même fichier est accédé en même temps. est ici les parties pertinentes du code:Enregistrement de fichiers dans un fichier et lecture du fichier bfile
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);
}
Voici le code pour voir si le fichier existe déjà:
private static Dictionary<String, bool> dict = new Dictionary<String, bool>();
public bool existsFile(string signature)
{
if (dict.ContainsKey(signature))
{
return true;
}
else
{
return false;
}
}
Voici ce que je l'utilise pour récupérer si elle existe déjà:
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() + "\"}";
}
Si le fichier n'existe pas, il enregistre le fichier JSON dans le fichier:
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 {
}
Voici les détails à l'exception parfois je reçois de l'exécution du code ci-dessus:
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)
Joli ratio élevé WTF/LOC, Je dois dire ... – SWeko