- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使用 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/
我正在使用以下内容写入文件: using(Stream FileStream = File.OpenWrite(FileName)) FileStream.Write(Contents, 0,
下面的代码是另一种创建带有 channel 的类的尝试。在这里,我直接从调用方传递一个 channel ,而不是在类中打开它。虽然代码给出了预期的结果,但我想知道这样做是否合法,特别是通过在 new
我正在使用 System.Net.FtpClient 程序集将文件上传到测试 FTP 站点。当我运行下面的代码时,文件不会出现在远程位置,除非我按照下面的方式使用 Thread.Sleep(我不想使用
我最近遇到了一个错误,或者至少是通过 .NET 客户端使用的 BlockBlob 的一个非常奇怪的行为。 基本上,写入和刷新的特定组合会损坏文件,如果您在写入后读回它,则响应流包含垃圾(更准确地说,它
我有以下代码来检测文件是否已在使用: public static bool FileInUse(string sFile) { FileStream file = null; try
我正在使用 DocumentFormat.OpenXml.SpreadsheetDocument 并打开 Excel 文档的模板,对其进行写入并保存。 它的工作原理就像普通文件流的魅力: using
我是一名优秀的程序员,十分优秀!