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

问题描述 投票:0回答:1

谁能告诉我如何消除错误

该进程无法访问该文件,因为该文件正在被另一个进程使用

这是我的代码

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 并且有两个访问此类的控制器。当我一次运行一个控制器时,它工作正常,但是当我同时运行两个控制器时,我在其中一个控制器中收到此错误:

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);

它工作正常并使用随机文件名保存文件,但我想传递我的文件名。怎么解决这个问题?

c# .net winscp winscp-net
1个回答
0
投票
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 
                session.GetFiles(Sftp_RemotePath,FilePath,false,  transferOptions).Check();
              
                session.Dispose();
                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;
}
© www.soinside.com 2019 - 2024. All rights reserved.