我在将文件从存储库移动到Webjob中的另一个文件时遇到一些问题。
我使用命令_session.MoveFile("mypathsource","mypathdestination")
。
我的网络作业每10分钟触发一次。
当我部署webjob时,它将移动文件,但是在我的webjob进行几次迭代后,它将不会移动文件。它不会引发任何异常。只是不移动文件。
我已经将NuGet软件包WinSCP更新到版本5.15.2。我使用的是.Net框架4.6.1。
public void SendFileToArchive(string fileName)
{
_log.DebugFormat("Deleting file on local path.");
File.Delete($"{_config.LocalPath}\\{fileName}");
if (!_session.Opened)
{
_log.DebugFormat("Session is closed -> Open it.");
this.OpenSession();
}
_log.DebugFormat("Move file.");
_session.MoveFile($"{fileName}", "Archive/" + fileName);
if (_session.FileExists(fileName))
{
_log.Error("File hasn't be moved");
}
}
private void OpenSession()
{
// Configurer les options de session
SessionOptions sessionOptions = new SessionOptions
{
Protocol = Protocol.Sftp,
HostName = _config.FtpUrl,
UserName = _config.FtpLogin,
Password = _config.FtpPwd,
SshHostKeyFingerprint = _config.SshHostKeyFingerprint,
};
sessionOptions.AddRawSettings("ProxyPort", "0");
_session = new Session();
// Connecter
_session.Open(sessionOptions);
}
我希望文件被移动,或者至少进程会引发异常。 有人知道我在做什么错吗?
在移动文件之前,我可以尝试检查目标文件的存在性,但是在我的用例中,如果这是原因,我将非常惊讶。因为我在发生错误后进行了手动检查,并且文件仅存在于源路径中。
对于openSession,我还没有发送全部代码给我,但是我在构造函数中调用了该方法(在我的webjob中仅使用了一次),或者当我检查move方法中的会话是否关闭时(我添加了这一部分)当我看到移动部分不起作用时检查连接状态)。
当然,当我完成所有过程时,我有一个dispose方法:
public void DisposeSession()
{
if (this._session.Opened)
{
this._session.Close();
}
this._session.Dispose();
}
这是日志:
. 2019-06-05 15:21:21.420 Listing file "FILETOMOVE_20190524_010139.json".
> 2019-06-05 15:21:21.420 Type: SSH_FXP_LSTAT, Size: 44, Number: 5639
< 2019-06-05 15:21:21.420 Type: SSH_FXP_STATUS, Size: 26, Number: 5380
. 2019-06-05 15:21:21.420 Discarding reserved response
< 2019-06-05 15:21:21.420 Type: SSH_FXP_ATTRS, Size: 54, Number: 5639
. 2019-06-05 15:21:21.420 FILETOMOVE_20190524_010139.json;-;1203;2019-05-23T23:01:40.000Z;3;"root" [0];"root" [0];rwxrwxrwx;1
< 2019-06-05 15:21:21.420 Script: -rwxrwxrwx 0 root root 1203 May 23 23:01:40 2019 FILETOMOVE_20190524_010139.json
> 2019-06-05 15:21:21.482 Script: stat -- "Archive/FILETOMOVE_20190524_010139.json"
. 2019-06-05 15:21:21.482 Listing file "Archive/FILETOMOVE_20190524_010139.json".
> 2019-06-05 15:21:21.482 Type: SSH_FXP_LSTAT, Size: 52, Number: 5895
< 2019-06-05 15:21:21.482 Type: SSH_FXP_ATTRS, Size: 54, Number: 5895
. 2019-06-05 15:21:21.482 FILETOMOVE_20190524_010139.json;-;1203;2019-05-23T23:01:40.000Z;3;"root" [0];"root" [0];rwxrwxrwx;1
< 2019-06-05 15:21:21.482 Script: -rwxrwxrwx 0 root root 1203 May 23 23:01:40 2019 FILETOMOVE_20190524_010139.json
> 2019-06-05 15:21:21.561 Script: mv "FILETOMOVE_20190524_010139.json" "Archive/FILETOMOVE_20190524_010139.json"
. 2019-06-05 15:21:21.561 Listing file "FILETOMOVE_20190524_010139.json".
> 2019-06-05 15:21:21.561 Type: SSH_FXP_LSTAT, Size: 44, Number: 6151
< 2019-06-05 15:21:21.577 Type: SSH_FXP_ATTRS, Size: 54, Number: 6151
. 2019-06-05 15:21:21.577 FILETOMOVE_20190524_010139.json;-;1203;2019-05-23T23:01:40.000Z;3;"root" [0];"root" [0];rwxrwxrwx;1
. 2019-06-05 15:21:21.577 Moving file "FILETOMOVE_20190524_010139.json" to "Archive/FILETOMOVE_20190524_010139.json".
> 2019-06-05 15:21:21.577 Type: SSH_FXP_RENAME, Size: 87, Number: 6418
< 2019-06-05 15:21:21.577 Type: SSH_FXP_STATUS, Size: 26, Number: 6418
< 2019-06-05 15:21:21.577 Status code: 0
< 2019-06-05 15:21:21.577 Script: FILETOMOVE_20190524_010139.json
> 2019-06-05 15:21:21.624 Script: stat -- "FILETOMOVE_20190524_010139.json"
. 2019-06-05 15:21:21.624 Listing file "FILETOMOVE_20190524_010139.json".
> 2019-06-05 15:21:21.624 Type: SSH_FXP_LSTAT, Size: 44, Number: 6663
< 2019-06-05 15:21:21.624 Type: SSH_FXP_ATTRS, Size: 54, Number: 6663
. 2019-06-05 15:21:21.624 FILETOMOVE_20190524_010139.json;-;1203;2019-05-23T23:01:40.000Z;3;"root" [0];"root" [0];rwxrwxrwx;1
< 2019-06-05 15:21:21.624 Script: -rwxrwxrwx 0 root root 1203 May 23 23:01:40 2019 FILETOMOVE_20190524_010139.json
有帮助吗?
答案 0 :(得分:0)
我假设您想在远程服务器上移动文件(您还将在该方法中删除本地文件)。
每次调用Session
时,您都在创建一个新的OpenSession()
-而不关闭/处置旧的sessionOptions.AddRawSettings("ProxyPort", "0");
。您只能在构造函数中创建一次会话。这可能是个问题。
此外,如果目标位置已存在,则无法移动远程文件-您无需进行检查,但可以采用其他方法。
考虑是否需要using System.Diagnostics;
using System.IO;
using WinSCP;
namespace WinSCPTest
{
public class SftpRemoteMoveTester
{
const char SftpDirectorySeparatorChar = '/';
static readonly SessionOptions SessionOptions = new SessionOptions
{
Protocol = Protocol.Sftp,
HostName = SftpConfig.HostName,
UserName = SftpConfig.UserName,
Password = SftpConfig.Password,
SshHostKeyFingerprint = SftpConfig.SshHostKeyFingerprint,
};
Session _sftpSession;
public SftpUploadTester()
{
_sftpSession = new Session();
}
public void MoveRemoteFile(
string remoteSourceDirectoryPath,
string fileName,
string remoteDestinationDirectoryPath)
{
var remoteSourceFilePath = CombineSftpPath(remoteSourceDirectoryPath, fileName);
var remoteDestinationFilePath = CombineSftpPath(remoteDestinationDirectoryPath, fileName);
OpenSessionIfNeeded();
if (!_sftpSession.FileExists(remoteSourceFilePath))
{
Debug.WriteLine("Remote source file does not exists -> return");
return;
}
if (_sftpSession.FileExists(remoteDestinationFilePath))
{
Debug.WriteLine("Remote destination file already exists -> return");
return;
}
_sftpSession.MoveFile(remoteSourceFilePath, remoteDestinationFilePath);
if (_sftpSession.FileExists(remoteSourceFilePath))
{
Debug.WriteLine("File hasn't be moved from source dir");
}
if (_sftpSession.FileExists(remoteSourceFilePath))
{
Debug.WriteLine("File doesn't exists in destination dir");
}
}
public void OpenSessionIfNeeded()
{
if (!_sftpSession.Opened)
{
Debug.WriteLine("Session is closed -> Open it.");
_sftpSession.Open(SessionOptions);
}
}
string CombineSftpPath(params string[] parts)
{
return Path.Combine(parts)
.Replace(Path.DirectorySeparatorChar, SftpDirectorySeparatorChar);
}
}
}
您可能会在会话日志中找到一些其他信息。
我根据您的代码创建了一个测试类。它适用于我-也适用于重复通话:
_sftpSession
该示例不包括您可能要添加的任何{{1}}处理方式。
答案 1 :(得分:0)
> 2019-06-05 15:21:21.561 Script: mv "FILETOMOVE_20190524_010139.json" "Archive/FILETOMOVE_20190524_010139.json"
. 2019-06-05 15:21:21.561 Listing file "FILETOMOVE_20190524_010139.json".
> 2019-06-05 15:21:21.561 Type: SSH_FXP_LSTAT, Size: 44, Number: 6151
< 2019-06-05 15:21:21.577 Type: SSH_FXP_ATTRS, Size: 54, Number: 6151
. 2019-06-05 15:21:21.577 FILETOMOVE_20190524_010139.json;-;1203;2019-05-23T23:01:40.000Z;3;"root" [0];"root" [0];rwxrwxrwx;1
. 2019-06-05 15:21:21.577 Moving file "FILETOMOVE_20190524_010139.json" to "Archive/FILETOMOVE_20190524_010139.json".
> 2019-06-05 15:21:21.577 Type: SSH_FXP_RENAME, Size: 87, Number: 6418
< 2019-06-05 15:21:21.577 Type: SSH_FXP_STATUS, Size: 26, Number: 6418
< 2019-06-05 15:21:21.577 Status code: 0
如您在日志中看到的,服务器不报告任何错误。它返回状态码0,表示成功。因此,如果文件不移动,则是服务器故障。