Skip to content

Commit

Permalink
Поддержка текущего каталога
Browse files Browse the repository at this point in the history
  • Loading branch information
dmpas committed Apr 10, 2017
1 parent febe81b commit 372bf36
Show file tree
Hide file tree
Showing 2 changed files with 90 additions and 19 deletions.
23 changes: 20 additions & 3 deletions TestApp/Program.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System;
using ScriptEngine.Machine;
using ScriptEngine.HostedScript;
using ScriptEngine.HostedScript.Library;
using oscriptFtp;
Expand Down Expand Up @@ -27,16 +28,32 @@ public static void Main(string[] args)
var script = engine.Loader.FromString(SCRIPT);
var process = engine.CreateProcess(new MainClass(), script);

var conn = FtpConnection.Constructor("localhost", 21, "dmpas", "") as FtpConnection;
var conn = FtpConnection.Constructor(ValueFactory.Create("10.2.150.7"), ValueFactory.Create(21),
ValueFactory.Create("update"), ValueFactory.Create("Black34")) as FtpConnection;
conn.SetCurrentDirectory("Storage1C");
Console.WriteLine("PWD: {0}", conn.GetCurrentDirectory());
conn.SetCurrentDirectory("Obmen");
Console.WriteLine("PWD: {0}", conn.GetCurrentDirectory());
conn.SetCurrentDirectory("/Storage1C/Obmen");
Console.WriteLine("PWD: {0}", conn.GetCurrentDirectory());

var files = conn.FindFiles("workspace", "*.deb", true);

var files = conn.FindFiles("", "", true);
var first = true;
foreach (var el in files)
{
var file = el as FtpFile;
Console.WriteLine("file: {0}", el);
if (first)
{
conn.Get(file.FullName, @"C:\temp\some.zip");
conn.Delete(file.FullName);
conn.Put(@"C:\temp\some.zip", file.FullName);
first = false;
}

}

Console.ReadKey();
}

public void Echo(string str, MessageStatusEnum status = MessageStatusEnum.Ordinary)
Expand Down
86 changes: 70 additions & 16 deletions oscript-ftp/FtpConnection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ namespace oscriptFtp
[ContextClass("FTPСоединение")]
public sealed class FtpConnection : AutoContext<FtpConnection>
{
private string _currentDirectory = "/";

public FtpConnection(
string server,
int port = 0,
Expand Down Expand Up @@ -75,7 +77,8 @@ Uri GetUri(string path)

FtpWebRequest GetRequest(string path)
{
var request = (FtpWebRequest)WebRequest.Create(GetUri(path));
var uri = GetUri(path);
var request = (FtpWebRequest)WebRequest.Create(uri);
if (!string.IsNullOrEmpty(User))
{
try
Expand All @@ -85,6 +88,9 @@ FtpWebRequest GetRequest(string path)
catch (NotImplementedException)
{
}
catch (NotSupportedException)
{
}
request.Credentials = new NetworkCredential(User, Password);
}

Expand All @@ -103,7 +109,6 @@ void ListFiles(string path, out IList<string> directories, out IList<string> fil
// дикий костыль: сначала берём список имён
// потом берём расширенный список и в нём ищем имена


var unresolvedNames = new List<string>();
{
var request = GetRequest(path);
Expand Down Expand Up @@ -160,10 +165,11 @@ public ArrayImpl FindFiles(string path, string mask = null, bool recursive = tru
{
var result = ArrayImpl.Constructor() as ArrayImpl;

if (!path.EndsWith("/", StringComparison.Ordinal))
if (!string.IsNullOrEmpty(path) && !path.EndsWith("/", StringComparison.Ordinal))
{
path += "/";
}
path = UniteFtpPath(_currentDirectory, path);

IList<string> files, directories;

Expand All @@ -175,6 +181,15 @@ public ArrayImpl FindFiles(string path, string mask = null, bool recursive = tru
{
return result;
}
catch (WebException ex)
{
var error = (FtpWebResponse)ex.Response;
if (error.StatusCode == FtpStatusCode.ActionNotTakenFileUnavailable)
{
return result;
}
throw ex;
}
catch
{
throw;
Expand Down Expand Up @@ -209,10 +224,13 @@ public void Put(string localFilePath, string remoteFilePath)
var request = GetRequest(remoteFilePath);
request.Method = WebRequestMethods.Ftp.UploadFile;

var requestStream = request.GetRequestStream();

using (var file = new FileStream(localFilePath, FileMode.Open))
{
file.CopyTo(request.GetRequestStream());
file.CopyTo(requestStream);
}
requestStream.Close();

request.GetResponse();
}
Expand Down Expand Up @@ -251,8 +269,7 @@ public void Move(string currentPath, string newPath)
request.GetResponse();
}

[ContextMethod("ТекущийКаталог")]
public string GetCurrentDirectory()
public string GetWorkingDirectory()
{
var request = GetRequest("");
request.Method = WebRequestMethods.Ftp.PrintWorkingDirectory;
Expand All @@ -262,21 +279,58 @@ public string GetCurrentDirectory()
return reader.ReadToEnd();
}

private string UniteFtpPath(string a, string b)
{
if (b.StartsWith("/", StringComparison.Ordinal))
{
return b;
}
var uri = GetUri(string.Format("{0}{1}", a, b));
return uri.LocalPath;
}

[ContextMethod("ТекущийКаталог")]
public string GetCurrentDirectory()
{
return _currentDirectory;
}

[ContextMethod("УстановитьТекущийКаталог")]
public void SetCurrentDirectory(string directory)
{
_currentDirectory = UniteFtpPath(_currentDirectory, directory);
if (!_currentDirectory.EndsWith("/", StringComparison.Ordinal))
{
_currentDirectory += "/";
}
}

[ContextMethod("СоздатьКаталог")]
public void CreateDirectory(string dirName)
{
var request = GetRequest(dirName);
request.Method = WebRequestMethods.Ftp.MakeDirectory;
var response = (FtpWebResponse)request.GetResponse();

}

[ScriptConstructor]
public static IRuntimeContextInstance Constructor(
string server,
int port = 0,
string userName = null,
string password = null,
IValue server,
IValue port = null,
IValue userName = null,
IValue password = null,
InternetProxyContext proxy = null,
bool? passiveConnection = null,
int timeout = 0,
IValue passiveConnection = null,
IValue timeout = null,
IValue secureConnection = null
)
{
var conn = new FtpConnection(server, port,
userName, password,
proxy, passiveConnection ?? false,
timeout, secureConnection);
var conn = new FtpConnection(server.AsString(),
(int)(port?.AsNumber() ?? 21),
userName?.AsString(), password?.AsString(),
proxy, passiveConnection?.AsBoolean() ?? false,
(int)(timeout?.AsNumber() ?? 0), secureConnection);
return conn;
}
}
Expand Down

0 comments on commit 372bf36

Please sign in to comment.