• R/O
  • HTTP
  • SSH
  • HTTPS

提交

标签
No Tags

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

FFFTPのソースコードです。


Commit MetaInfo

修订版ef527428cc012bea08aa748a53fd2fe8d686c880 (tree)
时间2017-11-14 16:35:10
作者t.masuda <masuda@moon...>
Commitert.masuda

Log Message

SSH.NET を使った FFFTP もどき(SSFTP)を試しに追加

更改概述

差异

--- a/FFFTP2.sln
+++ b/FFFTP2.sln
@@ -10,65 +10,66 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FFFTP2", "src\FFFTP2\FFFTP2
1010 EndProject
1111 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Test", "Test", "{BE63F71B-1E19-4665-B072-4812AAB9E0F0}"
1212 EndProject
13-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MFCApplication1", "src\MFCApplication1\MFCApplication1.vcxproj", "{E1E9344D-2109-4D0B-8541-86BC4B605F66}"
14-EndProject
15-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TestList", "src\TestList\TestList.vcxproj", "{7F97790D-1955-44DF-ABC5-59B7794A9671}"
13+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SSFTP", "src\SSFTP\SSFTP.csproj", "{C4E8882C-0A3D-4EE8-8247-E932EED5F8F1}"
1614 EndProject
1715 Global
1816 GlobalSection(SolutionConfigurationPlatforms) = preSolution
17+ Debug|Any CPU = Debug|Any CPU
1918 Debug|Win32 = Debug|Win32
2019 Debug|x64 = Debug|x64
20+ Release|Any CPU = Release|Any CPU
2121 Release|Win32 = Release|Win32
2222 Release|x64 = Release|x64
2323 EndGlobalSection
2424 GlobalSection(ProjectConfigurationPlatforms) = postSolution
25+ {5D9496DB-45AF-4389-8FEE-27C9A2FA207A}.Debug|Any CPU.ActiveCfg = Debug|Win32
2526 {5D9496DB-45AF-4389-8FEE-27C9A2FA207A}.Debug|Win32.ActiveCfg = Debug|Win32
2627 {5D9496DB-45AF-4389-8FEE-27C9A2FA207A}.Debug|Win32.Build.0 = Debug|Win32
2728 {5D9496DB-45AF-4389-8FEE-27C9A2FA207A}.Debug|x64.ActiveCfg = Debug|x64
2829 {5D9496DB-45AF-4389-8FEE-27C9A2FA207A}.Debug|x64.Build.0 = Debug|x64
30+ {5D9496DB-45AF-4389-8FEE-27C9A2FA207A}.Release|Any CPU.ActiveCfg = Release|Win32
2931 {5D9496DB-45AF-4389-8FEE-27C9A2FA207A}.Release|Win32.ActiveCfg = Release|Win32
3032 {5D9496DB-45AF-4389-8FEE-27C9A2FA207A}.Release|Win32.Build.0 = Release|Win32
3133 {5D9496DB-45AF-4389-8FEE-27C9A2FA207A}.Release|x64.ActiveCfg = Release|x64
3234 {5D9496DB-45AF-4389-8FEE-27C9A2FA207A}.Release|x64.Build.0 = Release|x64
35+ {EE7CC1BD-92A9-46D5-8270-386BD7BEEA55}.Debug|Any CPU.ActiveCfg = Debug|Win32
3336 {EE7CC1BD-92A9-46D5-8270-386BD7BEEA55}.Debug|Win32.ActiveCfg = Debug|Win32
3437 {EE7CC1BD-92A9-46D5-8270-386BD7BEEA55}.Debug|Win32.Build.0 = Debug|Win32
3538 {EE7CC1BD-92A9-46D5-8270-386BD7BEEA55}.Debug|x64.ActiveCfg = Debug|x64
3639 {EE7CC1BD-92A9-46D5-8270-386BD7BEEA55}.Debug|x64.Build.0 = Debug|x64
40+ {EE7CC1BD-92A9-46D5-8270-386BD7BEEA55}.Release|Any CPU.ActiveCfg = Release|Win32
3741 {EE7CC1BD-92A9-46D5-8270-386BD7BEEA55}.Release|Win32.ActiveCfg = Release|Win32
3842 {EE7CC1BD-92A9-46D5-8270-386BD7BEEA55}.Release|Win32.Build.0 = Release|Win32
3943 {EE7CC1BD-92A9-46D5-8270-386BD7BEEA55}.Release|x64.ActiveCfg = Release|x64
4044 {EE7CC1BD-92A9-46D5-8270-386BD7BEEA55}.Release|x64.Build.0 = Release|x64
45+ {717AD82D-B2D4-46C1-8A5E-738BB74FF512}.Debug|Any CPU.ActiveCfg = Debug|Win32
4146 {717AD82D-B2D4-46C1-8A5E-738BB74FF512}.Debug|Win32.ActiveCfg = Debug|Win32
4247 {717AD82D-B2D4-46C1-8A5E-738BB74FF512}.Debug|Win32.Build.0 = Debug|Win32
4348 {717AD82D-B2D4-46C1-8A5E-738BB74FF512}.Debug|x64.ActiveCfg = Debug|x64
4449 {717AD82D-B2D4-46C1-8A5E-738BB74FF512}.Debug|x64.Build.0 = Debug|x64
50+ {717AD82D-B2D4-46C1-8A5E-738BB74FF512}.Release|Any CPU.ActiveCfg = Release|Win32
4551 {717AD82D-B2D4-46C1-8A5E-738BB74FF512}.Release|Win32.ActiveCfg = Release|Win32
4652 {717AD82D-B2D4-46C1-8A5E-738BB74FF512}.Release|Win32.Build.0 = Release|Win32
4753 {717AD82D-B2D4-46C1-8A5E-738BB74FF512}.Release|x64.ActiveCfg = Release|x64
4854 {717AD82D-B2D4-46C1-8A5E-738BB74FF512}.Release|x64.Build.0 = Release|x64
49- {E1E9344D-2109-4D0B-8541-86BC4B605F66}.Debug|Win32.ActiveCfg = Debug|Win32
50- {E1E9344D-2109-4D0B-8541-86BC4B605F66}.Debug|Win32.Build.0 = Debug|Win32
51- {E1E9344D-2109-4D0B-8541-86BC4B605F66}.Debug|x64.ActiveCfg = Debug|x64
52- {E1E9344D-2109-4D0B-8541-86BC4B605F66}.Debug|x64.Build.0 = Debug|x64
53- {E1E9344D-2109-4D0B-8541-86BC4B605F66}.Release|Win32.ActiveCfg = Release|Win32
54- {E1E9344D-2109-4D0B-8541-86BC4B605F66}.Release|Win32.Build.0 = Release|Win32
55- {E1E9344D-2109-4D0B-8541-86BC4B605F66}.Release|x64.ActiveCfg = Release|x64
56- {E1E9344D-2109-4D0B-8541-86BC4B605F66}.Release|x64.Build.0 = Release|x64
57- {7F97790D-1955-44DF-ABC5-59B7794A9671}.Debug|Win32.ActiveCfg = Debug|Win32
58- {7F97790D-1955-44DF-ABC5-59B7794A9671}.Debug|Win32.Build.0 = Debug|Win32
59- {7F97790D-1955-44DF-ABC5-59B7794A9671}.Debug|x64.ActiveCfg = Debug|x64
60- {7F97790D-1955-44DF-ABC5-59B7794A9671}.Debug|x64.Build.0 = Debug|x64
61- {7F97790D-1955-44DF-ABC5-59B7794A9671}.Release|Win32.ActiveCfg = Release|Win32
62- {7F97790D-1955-44DF-ABC5-59B7794A9671}.Release|Win32.Build.0 = Release|Win32
63- {7F97790D-1955-44DF-ABC5-59B7794A9671}.Release|x64.ActiveCfg = Release|x64
64- {7F97790D-1955-44DF-ABC5-59B7794A9671}.Release|x64.Build.0 = Release|x64
55+ {C4E8882C-0A3D-4EE8-8247-E932EED5F8F1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
56+ {C4E8882C-0A3D-4EE8-8247-E932EED5F8F1}.Debug|Any CPU.Build.0 = Debug|Any CPU
57+ {C4E8882C-0A3D-4EE8-8247-E932EED5F8F1}.Debug|Win32.ActiveCfg = Debug|Any CPU
58+ {C4E8882C-0A3D-4EE8-8247-E932EED5F8F1}.Debug|Win32.Build.0 = Debug|Any CPU
59+ {C4E8882C-0A3D-4EE8-8247-E932EED5F8F1}.Debug|x64.ActiveCfg = Debug|Any CPU
60+ {C4E8882C-0A3D-4EE8-8247-E932EED5F8F1}.Debug|x64.Build.0 = Debug|Any CPU
61+ {C4E8882C-0A3D-4EE8-8247-E932EED5F8F1}.Release|Any CPU.ActiveCfg = Release|Any CPU
62+ {C4E8882C-0A3D-4EE8-8247-E932EED5F8F1}.Release|Any CPU.Build.0 = Release|Any CPU
63+ {C4E8882C-0A3D-4EE8-8247-E932EED5F8F1}.Release|Win32.ActiveCfg = Release|Any CPU
64+ {C4E8882C-0A3D-4EE8-8247-E932EED5F8F1}.Release|Win32.Build.0 = Release|Any CPU
65+ {C4E8882C-0A3D-4EE8-8247-E932EED5F8F1}.Release|x64.ActiveCfg = Release|Any CPU
66+ {C4E8882C-0A3D-4EE8-8247-E932EED5F8F1}.Release|x64.Build.0 = Release|Any CPU
6567 EndGlobalSection
6668 GlobalSection(SolutionProperties) = preSolution
6769 HideSolutionNode = FALSE
6870 EndGlobalSection
6971 GlobalSection(NestedProjects) = preSolution
70- {E1E9344D-2109-4D0B-8541-86BC4B605F66} = {BE63F71B-1E19-4665-B072-4812AAB9E0F0}
71- {7F97790D-1955-44DF-ABC5-59B7794A9671} = {BE63F71B-1E19-4665-B072-4812AAB9E0F0}
72+ {C4E8882C-0A3D-4EE8-8247-E932EED5F8F1} = {BE63F71B-1E19-4665-B072-4812AAB9E0F0}
7273 EndGlobalSection
7374 GlobalSection(ExtensibilityGlobals) = postSolution
7475 SolutionGuid = {47BFCD3B-7686-4D29-BCB4-1CCBB2D3A4AD}
--- a/src/FFFTP2/FFFTP2.vcxproj
+++ b/src/FFFTP2/FFFTP2.vcxproj
@@ -91,7 +91,7 @@
9191 <PrecompiledHeader>NotUsing</PrecompiledHeader>
9292 <WarningLevel>Level3</WarningLevel>
9393 <Optimization>Disabled</Optimization>
94- <PreprocessorDefinitions>WIN32;_WINSOCK_DEPRECATED_NO_WARNINGS;DO_NOT_REPLACE;_DEBUG;_WINDOWS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
94+ <PreprocessorDefinitions>DO_NOT_REPLACE;WIN32;_WINSOCK_DEPRECATED_NO_WARNINGS;_DEBUG;_WINDOWS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
9595 <SDLCheck>true</SDLCheck>
9696 <DisableSpecificWarnings>4996</DisableSpecificWarnings>
9797 <AdditionalIncludeDirectories>..\..\contrib\openssl\include;</AdditionalIncludeDirectories>
@@ -141,7 +141,7 @@
141141 <Optimization>MaxSpeed</Optimization>
142142 <FunctionLevelLinking>true</FunctionLevelLinking>
143143 <IntrinsicFunctions>true</IntrinsicFunctions>
144- <PreprocessorDefinitions>WIN32;_WINSOCK_DEPRECATED_NO_WARNINGS;DO_NOT_REPLACE;NDEBUG;_WINDOWS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
144+ <PreprocessorDefinitions>DO_NOT_REPLACE;WIN32;_WINSOCK_DEPRECATED_NO_WARNINGS;NDEBUG;_WINDOWS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
145145 <SDLCheck>true</SDLCheck>
146146 <DisableSpecificWarnings>4996</DisableSpecificWarnings>
147147 </ClCompile>
--- a/src/FFFTP2/FFFTP2View.cpp
+++ b/src/FFFTP2/FFFTP2View.cpp
@@ -99,8 +99,8 @@ void CFFFTP2View::OnInitialUpdate()
9999 m_lvLocal.SetImageList(&m_imageList, LVSIL_SMALL);
100100 m_lvRemote.SetImageList(&m_imageList, LVSIL_SMALL);
101101 SetListImg(m_imageList.GetSafeHandle());
102- static CBitmap bmpup; bmpup.LoadBitmapA(IDB_BITMAP_UP);
103- static CBitmap bmpopen; bmpopen.LoadBitmapA(IDB_BITMAP_OPEN);
102+ static CBitmap bmpup; bmpup.LoadBitmap(IDB_BITMAP_UP);
103+ static CBitmap bmpopen; bmpopen.LoadBitmap(IDB_BITMAP_OPEN);
104104
105105 m_btnLocalOpen.SetBitmap(bmpopen);
106106 m_btnRemoteOpen.SetBitmap(bmpopen);
--- a/src/FFFTP2/FFFtpCore.cpp
+++ b/src/FFFTP2/FFFtpCore.cpp
@@ -1,6 +1,7 @@
11 #include "stdafx.h"
22 #include "FFFtpCore.h"
33
4+using namespace FFFtp;
45
56 FFFtpCore::FFFtpCore()
67 {
@@ -14,11 +15,11 @@ FFFtpCore::~FFFtpCore()
1415 /////////////////////////////////////////////////////////////////////////////////////
1516 // FFFTP通信クラス
1617 /////////////////////////////////////////////////////////////////////////////////////
17-FFFtpSocket::FFFtpSocket()
18+FFFtpClient::FFFtpClient()
1819 {
1920 }
2021
2122
22-FFFtpSocket::~FFFtpSocket()
23+FFFtpClient::~FFFtpClient()
2324 {
2425 }
--- a/src/FFFTP2/FFFtpCore.h
+++ b/src/FFFTP2/FFFtpCore.h
@@ -1,15 +1,19 @@
11 #pragma once
2-class FFFtpCore
3-{
4-public:
5- FFFtpCore();
6- ~FFFtpCore();
7-};
8-
9-class FFFtpSocket
10-{
11-public:
12- FFFtpSocket();
13- ~FFFtpSocket();
14-};
2+
3+namespace FFFtp {
4+
5+ class FFFtpCore
6+ {
7+ public:
8+ FFFtpCore();
9+ ~FFFtpCore();
10+ };
11+
12+ class FFFtpClient
13+ {
14+ public:
15+ FFFtpClient();
16+ ~FFFtpClient();
17+ };
18+}
1519
--- a/src/FFFTP2/HostnameDlg.cpp
+++ b/src/FFFTP2/HostnameDlg.cpp
@@ -71,9 +71,9 @@ END_INTERFACE_MAP()
7171 void CHostnameDlg::OnBnClickedOk()
7272 {
7373 // TODO: ここにコントロール通知ハンドラー コードを追加します。
74- m_hostname.GetWindowTextA(Hostname);
75- m_user.GetWindowTextA(User);
76- m_pass.GetWindowTextA(Pass);
74+ m_hostname.GetWindowText(Hostname);
75+ m_user.GetWindowText(User);
76+ m_pass.GetWindowText(Pass);
7777 Firewall = m_firewall.GetCheck() ? true : false;
7878 Pasv = m_pasv.GetCheck() ? true : false;
7979
--- a/src/FFFTP2/MainFrm.cpp
+++ b/src/FFFTP2/MainFrm.cpp
@@ -342,7 +342,7 @@ int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
342342 // FFFTP の初期化
343343 ///////////////////////////////////////////////////////////
344344 // 初期化
345- InitApp(AfxGetApp()->m_lpCmdLine, 0);
345+ InitApp((LPSTR)AfxGetApp()->m_lpCmdLine, 0);
346346 // ソケットウィンドウを作成
347347 int StsSocket = MakeSocketWin(m_hWnd, AfxGetInstanceHandle());
348348 // FtpWndProc の設定
--- a/src/FFFTP2/OutputWnd.cpp
+++ b/src/FFFTP2/OutputWnd.cpp
@@ -126,7 +126,7 @@ void COutputWnd::UpdateFonts()
126126
127127 void COutputWnd::SetOutput(const char *s) {
128128 // ::SendMessage(m_wndOutputBuild.GetSafeHwnd(), LB_ADDSTRING, NULL, (LPARAM)s);
129- m_wndOutputBuild.AddString(s);
129+ m_wndOutputBuild.AddString((LPCTSTR)s);
130130 int index = m_wndOutputBuild.GetCount() - 1;
131131 m_wndOutputBuild.SetCurSel(index);
132132 m_wndOutputBuild.SetTopIndex(index);
--- /dev/null
+++ b/src/SSFTP/App.config
@@ -0,0 +1,6 @@
1+<?xml version="1.0" encoding="utf-8" ?>
2+<configuration>
3+ <startup>
4+ <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
5+ </startup>
6+</configuration>
\ No newline at end of file
--- /dev/null
+++ b/src/SSFTP/App.xaml
@@ -0,0 +1,9 @@
1+<Application x:Class="SSFTP.App"
2+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
3+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
4+ xmlns:local="clr-namespace:SSFTP"
5+ StartupUri="MainWindow.xaml">
6+ <Application.Resources>
7+
8+ </Application.Resources>
9+</Application>
--- /dev/null
+++ b/src/SSFTP/App.xaml.cs
@@ -0,0 +1,17 @@
1+using System;
2+using System.Collections.Generic;
3+using System.Configuration;
4+using System.Data;
5+using System.Linq;
6+using System.Threading.Tasks;
7+using System.Windows;
8+
9+namespace SSFTP
10+{
11+ /// <summary>
12+ /// App.xaml の相互作用ロジック
13+ /// </summary>
14+ public partial class App : Application
15+ {
16+ }
17+}
--- /dev/null
+++ b/src/SSFTP/MainWindow.xaml
@@ -0,0 +1,96 @@
1+<Window x:Class="SSFTP.MainWindow"
2+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
3+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
4+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
5+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
6+ xmlns:local="clr-namespace:SSFTP"
7+ mc:Ignorable="d"
8+ Title="SSFTP" Height="600" Width="800">
9+ <Grid>
10+ <Grid.RowDefinitions>
11+ <RowDefinition Height="50"/>
12+ <RowDefinition Height="*"/>
13+ <RowDefinition Height="100"/>
14+ </Grid.RowDefinitions>
15+ <Grid>
16+ <Grid.ColumnDefinitions>
17+ <ColumnDefinition Width="40"/>
18+ <ColumnDefinition Width="40"/>
19+ <ColumnDefinition Width="40"/>
20+ </Grid.ColumnDefinitions>
21+ <Button Content="接" Width="30" Height="30" Click="clickConnect"/>
22+ </Grid>
23+
24+ <Grid Grid.Row="1">
25+ <Grid.ColumnDefinitions>
26+ <ColumnDefinition Width="*"/>
27+ <ColumnDefinition Width="*"/>
28+ </Grid.ColumnDefinitions>
29+ <Grid.RowDefinitions>
30+ <RowDefinition Height="30"/>
31+ <RowDefinition Height="*"/>
32+ </Grid.RowDefinitions>
33+ <ListView x:Name="lvLocal" Grid.Row="1" AllowDrop="True"
34+ Drop="dropLocal"
35+ PreviewMouseLeftButtonDown="mouseleftLocal"
36+ >
37+ <ListView.Resources>
38+ <Style TargetType="{x:Type ListViewItem}">
39+ <EventSetter Event="MouseDoubleClick" Handler="lvLocal_MouseDoubleClick"/>
40+ </Style>
41+ </ListView.Resources>
42+ <ListView.View>
43+ <GridView>
44+ <GridViewColumn Header="名前" Width="50" DisplayMemberBinding="{Binding Name}"/>
45+ <GridViewColumn Header="日付" Width="50" DisplayMemberBinding="{Binding LastWriteTime }" />
46+ <GridViewColumn Header="サイズ" Width="50" DisplayMemberBinding="{Binding LengthOrDir}" />
47+ <GridViewColumn Header="種類" Width="50" DisplayMemberBinding="{Binding Ext}" />
48+ </GridView>
49+ </ListView.View>
50+ </ListView>
51+ <ListView x:Name="lvRemote" Grid.Row="1" Grid.Column="1" AllowDrop="True"
52+ Drop="dropRemote"
53+ PreviewMouseLeftButtonDown="mouseleftRemote"
54+ >
55+ <ListView.Resources>
56+ <Style TargetType="{x:Type ListViewItem}">
57+ <EventSetter Event="MouseDoubleClick" Handler="lvRemote_MouseDoubleClick"/>
58+ </Style>
59+ </ListView.Resources>
60+ <ListView.View>
61+ <GridView>
62+ <GridViewColumn Header="名前" Width="50" DisplayMemberBinding="{Binding Name}"/>
63+ <GridViewColumn Header="日付" Width="50" DisplayMemberBinding="{Binding LastWriteTime }" />
64+ <GridViewColumn Header="サイズ" Width="50" DisplayMemberBinding="{Binding LengthOrDir}" />
65+ <GridViewColumn Header="種類" Width="50" DisplayMemberBinding="{Binding Ext}" />
66+ <GridViewColumn Header="属性" Width="50" DisplayMemberBinding="{Binding Attr}" />
67+ <GridViewColumn Header="所有者" Width="50" DisplayMemberBinding="{Binding UserId}" />
68+ </GridView>
69+ </ListView.View>
70+ </ListView>
71+ <Grid>
72+ <Grid.ColumnDefinitions>
73+ <ColumnDefinition Width="40"/>
74+ <ColumnDefinition Width="40"/>
75+ <ColumnDefinition Width="*"/>
76+ </Grid.ColumnDefinitions>
77+ <Button Content="上" Width="30" Height="30" Click="clickLocalUp"/>
78+ <Button Content="開" Width="30" Height="30" Grid.Column="1"/>
79+ <ComboBox x:Name="cbLocal" Grid.Column="2" ></ComboBox>
80+ </Grid>
81+ <Grid Grid.Column="1">
82+ <Grid.ColumnDefinitions>
83+ <ColumnDefinition Width="40"/>
84+ <ColumnDefinition Width="40"/>
85+ <ColumnDefinition Width="*"/>
86+ </Grid.ColumnDefinitions>
87+ <Button Content="上" Width="30" Height="30" Click="clickRemoteUp"/>
88+ <Button Content="開" Width="30" Height="30" Grid.Column="1"/>
89+ <ComboBox x:Name="cbRemote" Grid.Column="2" ></ComboBox>
90+ </Grid>
91+
92+ </Grid>
93+ <ListBox Grid.Row="2" />
94+
95+ </Grid>
96+</Window>
--- /dev/null
+++ b/src/SSFTP/MainWindow.xaml.cs
@@ -0,0 +1,294 @@
1+using System;
2+using System.Collections.Generic;
3+using System.Linq;
4+using System.Text;
5+using System.Threading.Tasks;
6+using System.Windows;
7+using System.Windows.Controls;
8+using System.Windows.Data;
9+using System.Windows.Documents;
10+using System.Windows.Input;
11+using System.Windows.Media;
12+using System.Windows.Media.Imaging;
13+using System.Windows.Navigation;
14+using System.Windows.Shapes;
15+using Renci.SshNet;
16+using Renci.SshNet.Sftp;
17+using System.IO;
18+using System.Diagnostics;
19+
20+namespace SSFTP
21+{
22+ /// <summary>
23+ /// MainWindow.xaml の相互作用ロジック
24+ /// </summary>
25+ public partial class MainWindow : Window
26+ {
27+ public MainWindow()
28+ {
29+ InitializeComponent();
30+ this.Loaded += MainWindow_Loaded;
31+ }
32+
33+ private void MainWindow_Loaded(object sender, RoutedEventArgs e)
34+ {
35+ // ★最初のフォルダを指定する
36+ var path = @"D:\";
37+ updateLocal(path);
38+ }
39+
40+ SftpClient ftp;
41+ private void clickConnect(object sender, RoutedEventArgs e)
42+ {
43+ // ★ FTP 接続するサーバー名とユーザー名/パスワードを指定する
44+ ftp = new SftpClient("raspi3.local", "pi", "masuda");
45+ ftp.Connect();
46+ var path = "/home/pi";
47+ updateRemote(path);
48+ }
49+
50+ /// <summary>
51+ /// リモートをダブルクリック
52+ /// </summary>
53+ /// <param name="sender"></param>
54+ /// <param name="e"></param>
55+ private void lvRemote_MouseDoubleClick(object sender, MouseButtonEventArgs e)
56+ {
57+ ListViewItem targetItem = (ListViewItem)sender;
58+ var item = (SSFTPFile)targetItem.DataContext;
59+
60+ var path = "";
61+ if ( item.Name == ".." )
62+ {
63+ // 親フォルダへ
64+ cbRemote.SelectedIndex = 1;
65+ path = cbRemote.Items[1] as string;
66+ } else if ( item.LengthOrDir == "<DIR>" )
67+ {
68+ path = cbRemote.Text + "/" + item.Name;
69+ }
70+ else
71+ {
72+ return;
73+ }
74+ updateRemote(path);
75+ }
76+
77+ /// <summary>
78+ /// ローカルをダブルクリック
79+ /// </summary>
80+ /// <param name="sender"></param>
81+ /// <param name="e"></param>
82+ private void lvLocal_MouseDoubleClick(object sender, MouseButtonEventArgs e)
83+ {
84+ ListViewItem targetItem = (ListViewItem)sender;
85+ var item = (SSFTPFile)targetItem.DataContext;
86+
87+ var path = "";
88+ if (item.Name == "..")
89+ {
90+ // 親フォルダへ
91+ cbRemote.SelectedIndex = 1;
92+ path = cbRemote.Items[1] as string;
93+ }
94+ else if (item.LengthOrDir == "<DIR>")
95+ {
96+ path = cbLocal.Text + (cbLocal.Text.EndsWith("\\")? "": "\\") + item.Name;
97+ }
98+ else
99+ {
100+ return;
101+ }
102+ updateLocal(path);
103+ }
104+
105+ /// <summary>
106+ /// 親フォルダへ
107+ /// </summary>
108+ /// <param name="sender"></param>
109+ /// <param name="e"></param>
110+ private void clickLocalUp(object sender, RoutedEventArgs e)
111+ {
112+ // 親フォルダへ
113+ cbLocal.SelectedIndex = 1;
114+ var path = cbLocal.Items[1] as string;
115+ updateLocal(path);
116+ }
117+
118+ /// <summary>
119+ /// 親フォルダへ
120+ /// </summary>
121+ /// <param name="sender"></param>
122+ /// <param name="e"></param>
123+ private void clickRemoteUp(object sender, RoutedEventArgs e)
124+ {
125+ cbRemote.SelectedIndex = 1;
126+ var path = cbRemote.Items[1] as string;
127+ updateRemote(path);
128+ }
129+
130+ /// <summary>
131+ /// リモートのListViewを更新
132+ /// </summary>
133+ /// <param name="path"></param>
134+ void updateRemote( string path )
135+ {
136+ var items = ftp.ListDirectory(path);
137+ var lst = new List<SSFTPFile>();
138+ foreach (var it in items) { lst.Add(new SSFTPFile(it)); }
139+ lvRemote.ItemsSource = lst;
140+ if (cbRemote.Text != path)
141+ {
142+ cbRemote.Items.Insert(0, path);
143+ cbRemote.SelectedIndex = 0;
144+ }
145+ }
146+
147+ /// <summary>
148+ /// ローカルのListViewを更新
149+ /// </summary>
150+ /// <param name="path"></param>
151+ void updateLocal( string path )
152+ {
153+ var files = System.IO.Directory.GetFiles(path);
154+ var dirs = System.IO.Directory.GetDirectories(path);
155+ var lst = new List<SSFTPFile>();
156+ foreach (var it in files)
157+ {
158+ var f = new SSFTPFile();
159+ var fi = new FileInfo(it);
160+ f.FullName = fi.FullName;
161+ f.Name = fi.Name;
162+ f.LastWriteTime = fi.LastWriteTime;
163+ f.Length = fi.Length;
164+ f.Ext = fi.Extension;
165+ lst.Add(f);
166+ }
167+ foreach (var it in dirs)
168+ {
169+ var f = new SSFTPFile();
170+ var fi = new FileInfo(it);
171+ f.Name = System.IO.Path.GetFileName(it);
172+ f.LastWriteTime = fi.LastWriteTime;
173+ lst.Add(f);
174+ }
175+
176+ lvLocal.ItemsSource = lst;
177+ if (path != cbLocal.Text)
178+ {
179+ cbLocal.Items.Insert(0, path);
180+ cbLocal.SelectedIndex = 0;
181+ }
182+ }
183+
184+ /// <summary>
185+ /// ローカルへドロップ
186+ /// </summary>
187+ /// <param name="sender"></param>
188+ /// <param name="e"></param>
189+ private void dropLocal(object sender, DragEventArgs e)
190+ {
191+ string file = null;
192+ var files = e.Data.GetData(DataFormats.FileDrop) as string[];
193+ if ( files != null )
194+ {
195+ file = files[0];
196+ }
197+ if (file == null)
198+ {
199+ file = e.Data.GetData(DataFormats.Text) as string;
200+ }
201+ if (file == null) return;
202+ // ローカルからローカルへは禁止
203+ if (file.Substring(1, 1) == ":") return;
204+
205+ // ローカルにコピーする
206+ var path = cbLocal.Text;
207+ var fullpath = path + "\\" + System.IO.Path.GetFileName(file);
208+ using (var fs = System.IO.File.Open(fullpath, FileMode.OpenOrCreate))
209+ {
210+ ftp.DownloadFile(file, fs);
211+ updateLocal(path);
212+ }
213+ }
214+
215+ /// <summary>
216+ /// ローカルからドラッグ
217+ /// </summary>
218+ /// <param name="sender"></param>
219+ /// <param name="e"></param>
220+ private void mouseleftLocal(object sender, MouseButtonEventArgs e)
221+ {
222+ var item = lvLocal.SelectedItem as SSFTPFile;
223+ if (item != null && item.FullName != null )
224+ {
225+ DragDrop.DoDragDrop(lvLocal, item.FullName, DragDropEffects.Copy);
226+ }
227+ }
228+
229+ /// <summary>
230+ /// リモートへドロップ
231+ /// </summary>
232+ /// <param name="sender"></param>
233+ /// <param name="e"></param>
234+ private void dropRemote(object sender, DragEventArgs e)
235+ {
236+ string file = null;
237+ var files = e.Data.GetData(DataFormats.FileDrop) as string[];
238+ if (files != null)
239+ {
240+ file = files[0];
241+ }
242+ if (file == null)
243+ {
244+ file = e.Data.GetData(DataFormats.Text) as string;
245+ }
246+ if (file == null) return;
247+ // リモートからリモートへは禁止
248+ if (file.StartsWith("/")) return;
249+ // リモートへコピーする
250+
251+
252+ using (var fs = System.IO.File.Open(file, FileMode.Open))
253+ {
254+ var path = cbRemote.Text;
255+ var fullpath = path + "/" + System.IO.Path.GetFileName(file);
256+ ftp.UploadFile(fs, fullpath);
257+ updateRemote(path);
258+ }
259+ }
260+
261+ /// <summary>
262+ /// リモートからドラッグ
263+ /// </summary>
264+ /// <param name="sender"></param>
265+ /// <param name="e"></param>
266+ private void mouseleftRemote(object sender, MouseButtonEventArgs e)
267+ {
268+ var item = lvRemote.SelectedItem as SSFTPFile;
269+ if (item != null && item.FullName != null)
270+ {
271+ DragDrop.DoDragDrop(lvLocal, item.FullName, DragDropEffects.Copy);
272+ }
273+ }
274+ }
275+ public class SSFTPFile
276+ {
277+ public SSFTPFile() { }
278+ public SSFTPFile( SftpFile file )
279+ {
280+ this.FullName = file.FullName;
281+ this.Name = file.Name;
282+ this.LastWriteTime = file.LastWriteTime;
283+ this.Length = file.Length;
284+ this.Ext = System.IO.Path.GetExtension(this.Name);
285+ }
286+ public string FullName { get; set; }
287+ public string Name { get; set; }
288+ public DateTime LastWriteTime { get; set; }
289+ public long Length { get; set; }
290+ public string LengthOrDir { get {
291+ return (Length == 4096 || Length == 0) ? "<DIR>" : Length.ToString(); } }
292+ public string Ext { get; set; }
293+ }
294+}
--- /dev/null
+++ b/src/SSFTP/Properties/AssemblyInfo.cs
@@ -0,0 +1,55 @@
1+using System.Reflection;
2+using System.Resources;
3+using System.Runtime.CompilerServices;
4+using System.Runtime.InteropServices;
5+using System.Windows;
6+
7+// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。
8+// アセンブリに関連付けられている情報を変更するには、
9+// これらの属性値を変更してください。
10+[assembly: AssemblyTitle("SSFTP")]
11+[assembly: AssemblyDescription("")]
12+[assembly: AssemblyConfiguration("")]
13+[assembly: AssemblyCompany("")]
14+[assembly: AssemblyProduct("SSFTP")]
15+[assembly: AssemblyCopyright("Copyright © 2017")]
16+[assembly: AssemblyTrademark("")]
17+[assembly: AssemblyCulture("")]
18+
19+// ComVisible を false に設定すると、このアセンブリ内の型は COM コンポーネントから
20+// 参照できなくなります。COM からこのアセンブリ内の型にアクセスする必要がある場合は、
21+// その型の ComVisible 属性を true に設定してください。
22+[assembly: ComVisible(false)]
23+
24+//ローカライズ可能なアプリケーションのビルドを開始するには、
25+//.csproj ファイルの <UICulture>CultureYouAreCodingWith</UICulture> を
26+//<PropertyGroup> 内部で設定します。たとえば、
27+//ソース ファイルで英語を使用している場合、<UICulture> を en-US に設定します。次に、
28+//下の NeutralResourceLanguage 属性のコメントを解除します。下の行の "en-US" を
29+//プロジェクト ファイルの UICulture 設定と一致するよう更新します。
30+
31+//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
32+
33+
34+[assembly: ThemeInfo(
35+ ResourceDictionaryLocation.None, //テーマ固有のリソース ディクショナリが置かれている場所
36+ //(リソースがページ、
37+ //またはアプリケーション リソース ディクショナリに見つからない場合に使用されます)
38+ ResourceDictionaryLocation.SourceAssembly //汎用リソース ディクショナリが置かれている場所
39+ //(リソースがページ、
40+ //アプリケーション、またはいずれのテーマ固有のリソース ディクショナリにも見つからない場合に使用されます)
41+)]
42+
43+
44+// アセンブリのバージョン情報は次の 4 つの値で構成されています:
45+//
46+// メジャー バージョン
47+// マイナー バージョン
48+// ビルド番号
49+// Revision
50+//
51+// すべての値を指定するか、次を使用してビルド番号とリビジョン番号を既定に設定できます
52+// 既定値にすることができます:
53+// [assembly: AssemblyVersion("1.0.*")]
54+[assembly: AssemblyVersion("1.0.0.0")]
55+[assembly: AssemblyFileVersion("1.0.0.0")]
--- /dev/null
+++ b/src/SSFTP/Properties/Resources.Designer.cs
@@ -0,0 +1,71 @@
1+//------------------------------------------------------------------------------
2+// <auto-generated>
3+// このコードはツールによって生成されました。
4+// ランタイム バージョン:4.0.30319.42000
5+//
6+// このファイルへの変更は、以下の状況下で不正な動作の原因になったり、
7+// コードが再生成されるときに損失したりします
8+// </auto-generated>
9+//------------------------------------------------------------------------------
10+
11+namespace SSFTP.Properties
12+{
13+
14+
15+ /// <summary>
16+ /// ローカライズされた文字列などを検索するための、厳密に型指定されたリソース クラスです。
17+ /// </summary>
18+ // このクラスは StronglyTypedResourceBuilder クラスによって ResGen
19+ // または Visual Studio のようなツールを使用して自動生成されました。
20+ // メンバーを追加または削除するには、.ResX ファイルを編集して、/str オプションと共に
21+ // ResGen を実行し直すか、または VS プロジェクトをリビルドします。
22+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
23+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
24+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
25+ internal class Resources
26+ {
27+
28+ private static global::System.Resources.ResourceManager resourceMan;
29+
30+ private static global::System.Globalization.CultureInfo resourceCulture;
31+
32+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
33+ internal Resources()
34+ {
35+ }
36+
37+ /// <summary>
38+ /// このクラスで使用されるキャッシュされた ResourceManager インスタンスを返します。
39+ /// </summary>
40+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
41+ internal static global::System.Resources.ResourceManager ResourceManager
42+ {
43+ get
44+ {
45+ if ((resourceMan == null))
46+ {
47+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("SSFTP.Properties.Resources", typeof(Resources).Assembly);
48+ resourceMan = temp;
49+ }
50+ return resourceMan;
51+ }
52+ }
53+
54+ /// <summary>
55+ /// 厳密に型指定されたこのリソース クラスを使用して、すべての検索リソースに対し、
56+ /// 現在のスレッドの CurrentUICulture プロパティをオーバーライドします。
57+ /// </summary>
58+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
59+ internal static global::System.Globalization.CultureInfo Culture
60+ {
61+ get
62+ {
63+ return resourceCulture;
64+ }
65+ set
66+ {
67+ resourceCulture = value;
68+ }
69+ }
70+ }
71+}
--- /dev/null
+++ b/src/SSFTP/Properties/Resources.resx
@@ -0,0 +1,117 @@
1+<?xml version="1.0" encoding="utf-8"?>
2+<root>
3+ <!--
4+ Microsoft ResX Schema
5+
6+ Version 2.0
7+
8+ The primary goals of this format is to allow a simple XML format
9+ that is mostly human readable. The generation and parsing of the
10+ various data types are done through the TypeConverter classes
11+ associated with the data types.
12+
13+ Example:
14+
15+ ... ado.net/XML headers & schema ...
16+ <resheader name="resmimetype">text/microsoft-resx</resheader>
17+ <resheader name="version">2.0</resheader>
18+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
19+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
20+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
21+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
22+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
23+ <value>[base64 mime encoded serialized .NET Framework object]</value>
24+ </data>
25+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
26+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
27+ <comment>This is a comment</comment>
28+ </data>
29+
30+ There are any number of "resheader" rows that contain simple
31+ name/value pairs.
32+
33+ Each data row contains a name, and value. The row also contains a
34+ type or mimetype. Type corresponds to a .NET class that support
35+ text/value conversion through the TypeConverter architecture.
36+ Classes that don't support this are serialized and stored with the
37+ mimetype set.
38+
39+ The mimetype is used for serialized objects, and tells the
40+ ResXResourceReader how to depersist the object. This is currently not
41+ extensible. For a given mimetype the value must be set accordingly:
42+
43+ Note - application/x-microsoft.net.object.binary.base64 is the format
44+ that the ResXResourceWriter will generate, however the reader can
45+ read any of the formats listed below.
46+
47+ mimetype: application/x-microsoft.net.object.binary.base64
48+ value : The object must be serialized with
49+ : System.Serialization.Formatters.Binary.BinaryFormatter
50+ : and then encoded with base64 encoding.
51+
52+ mimetype: application/x-microsoft.net.object.soap.base64
53+ value : The object must be serialized with
54+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
55+ : and then encoded with base64 encoding.
56+
57+ mimetype: application/x-microsoft.net.object.bytearray.base64
58+ value : The object must be serialized into a byte array
59+ : using a System.ComponentModel.TypeConverter
60+ : and then encoded with base64 encoding.
61+ -->
62+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
63+ <xsd:element name="root" msdata:IsDataSet="true">
64+ <xsd:complexType>
65+ <xsd:choice maxOccurs="unbounded">
66+ <xsd:element name="metadata">
67+ <xsd:complexType>
68+ <xsd:sequence>
69+ <xsd:element name="value" type="xsd:string" minOccurs="0" />
70+ </xsd:sequence>
71+ <xsd:attribute name="name" type="xsd:string" />
72+ <xsd:attribute name="type" type="xsd:string" />
73+ <xsd:attribute name="mimetype" type="xsd:string" />
74+ </xsd:complexType>
75+ </xsd:element>
76+ <xsd:element name="assembly">
77+ <xsd:complexType>
78+ <xsd:attribute name="alias" type="xsd:string" />
79+ <xsd:attribute name="name" type="xsd:string" />
80+ </xsd:complexType>
81+ </xsd:element>
82+ <xsd:element name="data">
83+ <xsd:complexType>
84+ <xsd:sequence>
85+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
86+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
87+ </xsd:sequence>
88+ <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
89+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
90+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
91+ </xsd:complexType>
92+ </xsd:element>
93+ <xsd:element name="resheader">
94+ <xsd:complexType>
95+ <xsd:sequence>
96+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
97+ </xsd:sequence>
98+ <xsd:attribute name="name" type="xsd:string" use="required" />
99+ </xsd:complexType>
100+ </xsd:element>
101+ </xsd:choice>
102+ </xsd:complexType>
103+ </xsd:element>
104+ </xsd:schema>
105+ <resheader name="resmimetype">
106+ <value>text/microsoft-resx</value>
107+ </resheader>
108+ <resheader name="version">
109+ <value>2.0</value>
110+ </resheader>
111+ <resheader name="reader">
112+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
113+ </resheader>
114+ <resheader name="writer">
115+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
116+ </resheader>
117+</root>
\ No newline at end of file
--- /dev/null
+++ b/src/SSFTP/Properties/Settings.Designer.cs
@@ -0,0 +1,30 @@
1+//------------------------------------------------------------------------------
2+// <auto-generated>
3+// This code was generated by a tool.
4+// Runtime Version:4.0.30319.42000
5+//
6+// Changes to this file may cause incorrect behavior and will be lost if
7+// the code is regenerated.
8+// </auto-generated>
9+//------------------------------------------------------------------------------
10+
11+namespace SSFTP.Properties
12+{
13+
14+
15+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
16+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
17+ internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
18+ {
19+
20+ private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
21+
22+ public static Settings Default
23+ {
24+ get
25+ {
26+ return defaultInstance;
27+ }
28+ }
29+ }
30+}
--- /dev/null
+++ b/src/SSFTP/Properties/Settings.settings
@@ -0,0 +1,7 @@
1+<?xml version='1.0' encoding='utf-8'?>
2+<SettingsFile xmlns="uri:settings" CurrentProfile="(Default)">
3+ <Profiles>
4+ <Profile Name="(Default)" />
5+ </Profiles>
6+ <Settings />
7+</SettingsFile>
\ No newline at end of file
--- /dev/null
+++ b/src/SSFTP/SSFTP.csproj
@@ -0,0 +1,101 @@
1+<?xml version="1.0" encoding="utf-8"?>
2+<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
3+ <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
4+ <PropertyGroup>
5+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
6+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
7+ <ProjectGuid>{C4E8882C-0A3D-4EE8-8247-E932EED5F8F1}</ProjectGuid>
8+ <OutputType>WinExe</OutputType>
9+ <RootNamespace>SSFTP</RootNamespace>
10+ <AssemblyName>SSFTP</AssemblyName>
11+ <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
12+ <FileAlignment>512</FileAlignment>
13+ <ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
14+ <WarningLevel>4</WarningLevel>
15+ <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
16+ </PropertyGroup>
17+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
18+ <PlatformTarget>AnyCPU</PlatformTarget>
19+ <DebugSymbols>true</DebugSymbols>
20+ <DebugType>full</DebugType>
21+ <Optimize>false</Optimize>
22+ <OutputPath>bin\Debug\</OutputPath>
23+ <DefineConstants>DEBUG;TRACE</DefineConstants>
24+ <ErrorReport>prompt</ErrorReport>
25+ <WarningLevel>4</WarningLevel>
26+ </PropertyGroup>
27+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
28+ <PlatformTarget>AnyCPU</PlatformTarget>
29+ <DebugType>pdbonly</DebugType>
30+ <Optimize>true</Optimize>
31+ <OutputPath>bin\Release\</OutputPath>
32+ <DefineConstants>TRACE</DefineConstants>
33+ <ErrorReport>prompt</ErrorReport>
34+ <WarningLevel>4</WarningLevel>
35+ </PropertyGroup>
36+ <ItemGroup>
37+ <Reference Include="Renci.SshNet, Version=2016.1.0.0, Culture=neutral, PublicKeyToken=1cee9f8bde3db106, processorArchitecture=MSIL">
38+ <HintPath>..\..\packages\SSH.NET.2016.1.0\lib\net40\Renci.SshNet.dll</HintPath>
39+ </Reference>
40+ <Reference Include="System" />
41+ <Reference Include="System.Data" />
42+ <Reference Include="System.Xml" />
43+ <Reference Include="Microsoft.CSharp" />
44+ <Reference Include="System.Core" />
45+ <Reference Include="System.Xml.Linq" />
46+ <Reference Include="System.Data.DataSetExtensions" />
47+ <Reference Include="System.Net.Http" />
48+ <Reference Include="System.Xaml">
49+ <RequiredTargetFramework>4.0</RequiredTargetFramework>
50+ </Reference>
51+ <Reference Include="WindowsBase" />
52+ <Reference Include="PresentationCore" />
53+ <Reference Include="PresentationFramework" />
54+ </ItemGroup>
55+ <ItemGroup>
56+ <ApplicationDefinition Include="App.xaml">
57+ <Generator>MSBuild:Compile</Generator>
58+ <SubType>Designer</SubType>
59+ </ApplicationDefinition>
60+ <Page Include="MainWindow.xaml">
61+ <Generator>MSBuild:Compile</Generator>
62+ <SubType>Designer</SubType>
63+ </Page>
64+ <Compile Include="App.xaml.cs">
65+ <DependentUpon>App.xaml</DependentUpon>
66+ <SubType>Code</SubType>
67+ </Compile>
68+ <Compile Include="MainWindow.xaml.cs">
69+ <DependentUpon>MainWindow.xaml</DependentUpon>
70+ <SubType>Code</SubType>
71+ </Compile>
72+ </ItemGroup>
73+ <ItemGroup>
74+ <Compile Include="Properties\AssemblyInfo.cs">
75+ <SubType>Code</SubType>
76+ </Compile>
77+ <Compile Include="Properties\Resources.Designer.cs">
78+ <AutoGen>True</AutoGen>
79+ <DesignTime>True</DesignTime>
80+ <DependentUpon>Resources.resx</DependentUpon>
81+ </Compile>
82+ <Compile Include="Properties\Settings.Designer.cs">
83+ <AutoGen>True</AutoGen>
84+ <DependentUpon>Settings.settings</DependentUpon>
85+ <DesignTimeSharedInput>True</DesignTimeSharedInput>
86+ </Compile>
87+ <EmbeddedResource Include="Properties\Resources.resx">
88+ <Generator>ResXFileCodeGenerator</Generator>
89+ <LastGenOutput>Resources.Designer.cs</LastGenOutput>
90+ </EmbeddedResource>
91+ <None Include="packages.config" />
92+ <None Include="Properties\Settings.settings">
93+ <Generator>SettingsSingleFileGenerator</Generator>
94+ <LastGenOutput>Settings.Designer.cs</LastGenOutput>
95+ </None>
96+ </ItemGroup>
97+ <ItemGroup>
98+ <None Include="App.config" />
99+ </ItemGroup>
100+ <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
101+</Project>
\ No newline at end of file
--- /dev/null
+++ b/src/SSFTP/packages.config
@@ -0,0 +1,4 @@
1+<?xml version="1.0" encoding="utf-8"?>
2+<packages>
3+ <package id="SSH.NET" version="2016.1.0" targetFramework="net461" />
4+</packages>
\ No newline at end of file