gpt4 book ai didi

c# - System.Net.FtpClient openwrite 不会上传文件,除非我在退出前插休眠眠

转载 作者:太空狗 更新时间:2023-10-29 21:38:26 25 4
gpt4 key购买 nike

我正在使用 System.Net.FtpClient 程序集将文件上传到测试 FTP 站点。当我运行下面的代码时,文件不会出现在远程位置,除非我按照下面的方式使用 Thread.Sleep(我不想使用它):

using System;
using System.IO;
using System.Net;
using System.Net.FtpClient;
using System.Security.Cryptography.X509Certificates;
using System.Threading;

namespace FtpsUploadTest
{
/// <summary>
/// The ftp publisher.
/// </summary>
public class FtpPublisher
{
private readonly FtpsSettings _settings;
private readonly IFtpClient _ftpClient;

/// <summary>
/// Initializes a new instance of the <see cref="FtpPublisher"/> class.
/// </summary>
public FtpPublisher()
{
_ftpClient = new FtpClient();
_settings = SettingsReader.GetMySettings();
Init();
}


/// <summary>
/// The publish.
/// </summary>
/// <param name="fileToUpload">
/// The input file path.
/// </param>
public void Publish(string fileToUpload)
{
var remoteFileName = Path.GetFileName(fileToUpload);

Console.WriteLine("FTPS host: {0} remote path: {1}", _settings.FtpsRemoteHost, _settings.FtpsRemotePath);

if (!_ftpClient.IsConnected)
{
_ftpClient.Connect();
}

var fullRemotePath = string.Format("{0}/{1}", _settings.FtpsRemotePath, remoteFileName);

using (var ftpStream = _ftpClient.OpenWrite(fullRemotePath))
using (var inputStream = new FileStream(fileToUpload, FileMode.Open))
{
inputStream.CopyTo(ftpStream);
Thread.Sleep(5000); // <------------------- DOESNT WORK IF REMOVE THIS SLEEP!!
}

Console.WriteLine("File '{0}' published successfully", fileToUpload);
}


private void Init()
{
_ftpClient.Host = _settings.FtpsRemoteHost;
_ftpClient.Port = _settings.FtpsRemotePort;
_ftpClient.DataConnectionConnectTimeout = 60000;
_ftpClient.ConnectTimeout = 60000;
_ftpClient.Credentials = new NetworkCredential(_settings.FtpsUserId, string.Empty);
_ftpClient.DataConnectionType = 0;

if (string.IsNullOrEmpty(_settings.CertFile) || string.IsNullOrEmpty(_settings.CertPassword))
{
return;
}

_ftpClient.ClientCertificates.Add(CreateCertificate(_settings.CertFile, _settings.CertPassword));
_ftpClient.EncryptionMode = (FtpEncryptionMode)2;
_ftpClient.DataConnectionEncryption = true;
}


private X509Certificate CreateCertificate(string certFile, string certPassword)
{
return new X509Certificate(certFile, certPassword, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet);
}
}
}

任何人都知道如何在不使用 Thread.Sleep 的情况下让它工作?我尝试过刷新、关闭流,但这没有帮助。

最佳答案

远程 FTP 服务器与您的代码完全异步运行。根据服务器的配置,它可能会在使文件可用之前执行诸如扫描病毒或其他簿记之类的操作。除非您可以直接控制 FTP 服务器,否则您可能无能为力。即便如此,它也可能需要进行一些非常深入的配置更改,甚至需要不同的软件包。

可能对您有用的一件事是在完成上传后“轮询”文件。制作一个检查文件的循环,等待 1 秒,然后重复直到找到文件或放弃。 Async/Await 模式,或来自不同线程的回调,可以帮助您摆脱任何 UI 卡住(如果这是一个问题)。

关于c# - System.Net.FtpClient openwrite 不会上传文件,除非我在退出前插休眠眠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35558561/

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