gpt4 book ai didi

c# - 文件正在被另一个进程错误使用

转载 作者:太空宇宙 更新时间:2023-11-03 15:48:27 25 4
gpt4 key购买 nike

谁能告诉我如何摆脱这个错误

The process cannot access the file because it is being used by another process

这是我的代码

if (!File.Exists(FlagFilePath))
{
Debug.WriteLine("Trying to download sales data file ");

SessionOptions sessionOptions = new SessionOptions
{
Protocol = Protocol.Sftp,
HostName = ConfigurationManager.AppSettings["SFTPDomain"],
UserName = ConfigurationManager.AppSettings["SFTPUser"],
Password = ConfigurationManager.AppSettings["SFTPPass"],
PortNumber = Convert.ToInt32(ConfigurationManager.AppSettings["SFTPPortNumber"]),
GiveUpSecurityAndAcceptAnySshHostKey = true,

};

using (Session session = new Session())
{

//Attempts to connect to your SFtp site
session.Open(sessionOptions);

//Get SFtp File
TransferOptions transferOptions = new TransferOptions();
transferOptions.TransferMode = TransferMode.Binary; //The Transfer Mode - Automatic, Binary, or Ascii
transferOptions.FilePermissions = null; //Permissions applied to remote files;
transferOptions.PreserveTimestamp = false; //Set last write time of destination file
//to that of source file - basically change the timestamp to match destination and source files.
transferOptions.ResumeSupport.State = TransferResumeSupportState.Off;
//SFTP File Path
Sftp_RemotePath = ConfigurationManager.AppSettings["SFTPFileName"].ToString();
//Delete File if Exist
if (System.IO.File.Exists(FilePath))
{
System.IO.File.Delete(FilePath);
}
//the parameter list is: remote Path, Local Path with filename
TransferOperationResult transferOperationResult = session.GetFiles(Sftp_RemotePath, FilePath , false, transferOptions);

//Throw on any error
transferOperationResult.Check();
Debug.WriteLine("Downloaded fresh sales data file!");
}
}

我正在使用 MVC,并且有两个访问此类的 Controller 。当我一次运行一个 Controller 时,它工作正常,但是当我同时运行两个 Controller 时,其中一个 Controller 出现此错误:

WinSCP.SessionRemoteException: Can't create file 'D:\TESTING\SFTP\Data.csv'. ---> WinSCP.SessionRemoteException: System Error.
Code: 32.
The process cannot access the file because it is being used by another process
--- End of inner exception stack trace ---
at WinSCP.OperationResultBase.Check()
at JetStarAPI.Models.SFTPClient.DownloadFile(String FilePath) in D:\TESTING\SFTP\Models\SFTPClient.cs:line 65}

我在这一行之后收到这个错误

 transferOperationResult.Check();

如果我在这里更改文件名

   TransferOperationResult transferOperationResult = session.GetFiles(Sftp_RemotePath, FilePath+Path.GetRandomFileName() , false, transferOptions);

它工作正常并使用随机文件名保存文件,但我想传递我的文件名。如何解决?

最佳答案

static bool IsDownloadInProgress = false;

public static string DownloadFile(string FilePath)
{

string SalesStatus = "ok";
try
{

if (!File.Exists(FlagFilePath) && !IsDownloadInProgress)
{
Debug.WriteLine("Trying to download sales data file ");

SessionOptions sessionOptions = new SessionOptions
{
Protocol = Protocol.Sftp,
HostName = ConfigurationManager.AppSettings["SFTPDomain"],
UserName = ConfigurationManager.AppSettings["SFTPUser"],
Password = ConfigurationManager.AppSettings["SFTPPass"],
PortNumber = Convert.ToInt32(ConfigurationManager.AppSettings["SFTPPortNumber"]),
GiveUpSecurityAndAcceptAnySshHostKey = true,

};

using (Session session = new Session())
{

//Attempts to connect to your SFtp site
session.Open(sessionOptions);

//Get SFtp File
TransferOptions transferOptions = new TransferOptions();
transferOptions.TransferMode = TransferMode.Binary; //The Transfer Mode - Automatic, Binary, or Ascii
transferOptions.FilePermissions = null; //Permissions applied to remote files;
transferOptions.PreserveTimestamp = false; //Set last write time of destination file
//to that of source file - basically change the timestamp to match destination and source files.
transferOptions.ResumeSupport.State = TransferResumeSupportState.On;
//SFTP File Path
Sftp_RemotePath = ConfigurationManager.AppSettings["SFTPFileName"].ToString();
//Delete File if Exist
if (System.IO.File.Exists(FilePath))
{
System.IO.File.Delete(FilePath);
}
//Throw on any error
session.FileTransferred += OnFileTransferComplete;
IsDownloadInProgress = true;

//the parameter list is: remote Path, Local Path with filename
// string result = Path.GetRandomFileName();
session.GetFiles(Sftp_RemotePath,FilePath,false, transferOptions).Check();


session.Dispose();
// File.Move(FilePath, "foo2.png");
Debug.WriteLine("Downloaded fresh sales data file!");
}
}
}

catch (Exception ex)
{

string _errorMsg = "";
// Setting Sales Status values
if (ex.InnerException != null)
{
if (ex.InnerException.Message.Contains("Authentication failed"))
{
_errorMsg = ex.InnerException.Message;
Debug.WriteLine("wrong username/password");
SalesStatus = "2";
}
else if (ex.InnerException.Message.Contains("No such file or directory"))
{
_errorMsg = ex.InnerException.Message;
Debug.WriteLine("File is not Available");
SalesStatus = "3";
}
}
else
{
_errorMsg = ex.Message;
Debug.WriteLine("General SFTP Error");
SalesStatus = "4";
}


//Create log error file
if (!File.Exists(FlagFilePath))
{
// create SFTP LocalErrorFlag
Debug.WriteLine("Creating SFTP flag file");
System.IO.File.WriteAllText(FlagFilePath, "SFTP Error: " + _errorMsg);
}
else
{
Debug.WriteLine("SFTP error Flag file already exists");
}


}
return SalesStatus;
}

private static void OnFileTransferComplete(object sender, TransferEventArgs e)
{
IsDownloadInProgress = false;
((Session)sender).FileTransferred -= OnFileTransferComplete;
}

关于c# - 文件正在被另一个进程错误使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27008195/

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