Файл используется другой ошибкой процесса

Может кто подскажет как избавиться от ошибки

Процесс не может получить доступ к файлу, так как он используется другим процессом

Вот мой код

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

Он отлично работает и сохраняет файл со случайным именем файла, но я хочу передать свое имя файла. Как это решить?


person user3754674    schedule 19.11.2014    source источник
comment
Вам нужно убедиться, что файл еще не открыт ни в вашем коде, ни в каком-либо другом приложении. Поиск этой ошибки в Google выдаст целую кучу примеров.   -  person Xcelled    schedule 19.11.2014
comment
он отлично работает для одного запроса, но когда я нажимаю оба контроллера вместе, я получаю эту ошибку, и это строка TransferOperationResult transferOperationResult = session.GetFiles(Sftp_RemotePath, FilePath, false, transferOptions); когда я меняю FilePath на FilePath+Path.GetRandomFileName(), он работает   -  person user3754674    schedule 19.11.2014
comment
Да, потому что один контроллер уже открыл и заблокировал файл, а другой пытается открыть его одновременно, что приводит к этому исключению. По сути, вы пытаетесь открыть файл дважды. Ваш GetRandomFileName работает, потому что каждый контроллер получает другой результат от этого метода и, следовательно, каждый обращается к другому файлу.   -  person Xcelled    schedule 19.11.2014
comment
так как я должен решить это?   -  person user3754674    schedule 19.11.2014


Ответы (1)


person    schedule
comment
@ спасибо, но я использую Winscp для загрузки с SFTP и нет метода .FileTransferred :$ - person user3754674; 19.11.2014
comment
@user3754674 user3754674 это событие в классе Session, а не метод. Пожалуйста, проверьте это winscp.net/eng/docs/library_session_filetransferred - person Piyush Parashar; 19.11.2014
comment
я отредактировал ваш код, и я использую его, но все равно та же ошибка, правильно ли я это делаю? - person user3754674; 19.11.2014
comment
Подписка на событие FileTransferred перемещена над вызовом GetFiles. Кроме того, IsDownloadInProgress должна быть глобальной переменной, которая должна быть активной на протяжении всех вызовов. - person Piyush Parashar; 19.11.2014
comment
я получаю ту же ошибку, вы можете обновить код ?? - person user3754674; 19.11.2014
comment
Можете ли вы выполнить отладку и посмотреть, обновляются ли значения IsDownloadInProgress? Кроме того, это многопоточное приложение? Я не уверен, правильно ли класс Session закрывает файловый поток или нет. - person Piyush Parashar; 19.11.2014
comment
Session.GetFiles является синхронным, поэтому вам не нужно проверять завершение передачи асинхронно (хотя это, очевидно, должно работать, но это излишне). - person Martin Prikryl; 19.11.2014