से बाहर जाने से पहले नींद डालता हूं, मैं एक परीक्षण FTP साइट पर फ़ाइल अपलोड करने के लिए System.Net.FtpClient असेंबली का उपयोग कर रहा हूं। जब तक मैं नीचे के अनुसार एक Thread.Sleep का उपयोग करें (जो मैं उपयोग करने के लिए नहीं करना चाहते हैं) जब मैं नीचे दिए गए कोड को चलाने फ़ाइल दूरस्थ स्थान में प्रकट नहीं होता:System.Net.FtpClient openwrite फ़ाइल अपलोड नहीं करता है जब तक कि मैं
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);
}
}
}
किसी को भी पता है कि मैं कैसे प्राप्त कर सकते हैं यह थ्रेड का उपयोग किए बिना काम करने के लिए। सो जाओ? मैंने flushing, धाराओं को बंद करने की कोशिश की है, लेकिन यह मदद नहीं करता है।
आप अपने आवेदन में सूत्रण उपयोग करते हैं? क्या एक ही 'FtpPublisher' उदाहरण गलती से कई धागे द्वारा उपयोग किया जा सकता है? –
क्या फ़ाइल सिर्फ कोड के लिए दृश्यमान नहीं है, भले ही आप डीबगर में कई सेकंड प्रतीक्षा करें? –
जोआचिम, यहां कोई थ्रेडिंग नहीं किया जा रहा है। मैंने उदाहरण को यथासंभव सरल बना दिया है और समस्या को पुन: पेश करने में सक्षम था। – user1229458