Phase 06 complete: - Namespace renamed in 62 .cs files (namespace + using directives) - AssemblyName + RootNamespace updated in csproj files - FanucProgramManager.csproj → NcProgramManager.csproj - FanucProgramManager.sln → NcProgramManager.sln - FanucProgramManager.Tests/ → NcProgramManager.Tests/ - FANUCMachine.cs deleted (dead code, zero references) Fanuc-prefixed class names kept (FanucMachine, FanucProgram, IFanucMachine) — manufacturer identifiers, not project names. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
71 lines
2.8 KiB
C#
71 lines
2.8 KiB
C#
using System;
|
|
using System.IO;
|
|
using System.Net;
|
|
using System.Text;
|
|
|
|
namespace NcProgramManager.Cnc.Siemens
|
|
{
|
|
/// <summary>FTP client for Siemens Sinumerik CNC program transfer.</summary>
|
|
internal sealed class SiemensFtpClient : ISiemensFtpClient
|
|
{
|
|
private readonly SiemensConnectionConfig _config;
|
|
|
|
public SiemensFtpClient(SiemensConnectionConfig config)
|
|
{
|
|
_config = config ?? throw new ArgumentNullException("config");
|
|
}
|
|
|
|
/// <summary>Verify FTP server is reachable by listing the program directory.</summary>
|
|
public bool Ping()
|
|
{
|
|
try
|
|
{
|
|
var req = CreateRequest(_config.ProgramDirectory, WebRequestMethods.Ftp.ListDirectory);
|
|
using (var resp = (FtpWebResponse)req.GetResponse())
|
|
return resp.StatusCode == FtpStatusCode.DataAlreadyOpen
|
|
|| resp.StatusCode == FtpStatusCode.OpeningData
|
|
|| (int)resp.StatusCode / 100 == 2;
|
|
}
|
|
catch { return false; }
|
|
}
|
|
|
|
/// <summary>Download file from Sinumerik to string (upload from CNC perspective).</summary>
|
|
public string DownloadFile(string ncPath)
|
|
{
|
|
var req = CreateRequest(ncPath, WebRequestMethods.Ftp.DownloadFile);
|
|
using (var resp = (FtpWebResponse)req.GetResponse())
|
|
using (var reader = new StreamReader(resp.GetResponseStream(), Encoding.ASCII))
|
|
return reader.ReadToEnd();
|
|
}
|
|
|
|
/// <summary>Upload string content to Sinumerik (download from CNC perspective).</summary>
|
|
public void UploadFile(string ncPath, string content)
|
|
{
|
|
var req = CreateRequest(ncPath, WebRequestMethods.Ftp.UploadFile);
|
|
byte[] data = Encoding.ASCII.GetBytes(content);
|
|
req.ContentLength = data.Length;
|
|
using (var stream = req.GetRequestStream())
|
|
stream.Write(data, 0, data.Length);
|
|
using ((FtpWebResponse)req.GetResponse()) { }
|
|
}
|
|
|
|
public void DeleteFile(string ncPath)
|
|
{
|
|
var req = CreateRequest(ncPath, WebRequestMethods.Ftp.DeleteFile);
|
|
using ((FtpWebResponse)req.GetResponse()) { }
|
|
}
|
|
|
|
private FtpWebRequest CreateRequest(string path, string method)
|
|
{
|
|
string uri = string.Format("ftp://{0}:{1}{2}", _config.IpAddress, _config.Port, path);
|
|
var req = (FtpWebRequest)WebRequest.Create(uri);
|
|
req.Method = method;
|
|
req.Credentials = new NetworkCredential(_config.Username, _config.Password);
|
|
req.Timeout = (int)_config.RequestTimeout.TotalMilliseconds;
|
|
req.KeepAlive = false;
|
|
req.UseBinary = false;
|
|
req.UsePassive = true;
|
|
return req;
|
|
}
|
|
}
|
|
}
|