我试图弄清楚如何在我仍在从另一个进程/计算机写入 ftp 时阻止访问同一个 ftp 流。
这是我尝试的代码:
internal static bool WriteFileToServer(string urlToWriteOn, string strAllContent)
{
Uri ServerUri = new Uri(urlToWriteOn);
if (ServerUri.Scheme != Uri.UriSchemeFtp)
return false;
// Get the object used to communicate with the server.
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(ServerUri);
request.Method = WebRequestMethods.Ftp.UploadFile;
byte[] ContentsToWrite = Encoding.UTF8.GetBytes(strAllContent);
request.ContentLength = ContentsToWrite.Length;
request.Credentials = new NetworkCredential(UserID, Password);
request.UsePassive = false;
request.KeepAlive = false;
Stream requestStream = request.GetRequestStream();
requestStream.Write(ContentsToWrite, 0, ContentsToWrite.Length);
System.Threading.Thread.Sleep(10000);
requestStream.Close();
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
response.Close();
return true;
}
我制作了 2 个线程同时访问该函数,它们在写入 ftp 后(在关闭部分之前)都停止在睡眠行中。对于测试,第一个线程写入 10,000 行,第二个线程写入 500 行。
实际上,第一个线程在ftp上创建新文件并写入所有行,然后是另一个线程并在前500行上重写(第一个线程中的其他9,500行保持存在)我希望第二个线程会引发异常,但事实并非如此。如果写入ftp的代码来自同一应用程序,我正在解决问题,但它将从2台不同的计算机编写,并且我不希望另一台计算机同时写入ftp文件。
相信您希望从客户端完成。 我的猜测是,更好的方法是写入"随机"文件名或扩展名为".inprogress"之类的文件名,然后在上传完成后适当地重命名文件。