56 m_winScpPath = lpszWinScpPath;
60 #ifdef CSIDL_PROGRAM_FILESX86
61 if ( ! SUCCEEDED(::SHGetFolderPath(NULL, CSIDL_PROGRAM_FILESX86, NULL, 0, buf)) )
64 ::SHGetFolderPath(NULL, CSIDL_PROGRAM_FILES, NULL, 0, buf);
70 m_winScpPath += _T(
"\\");
89 bool Open(LPCTSTR lpszServerName, LPCTSTR lpszUserName, LPCTSTR lpszPassword, DWORD to = 10000)
96 CStr cl = m_winScpPath + _T(
"WinSCP\\WinSCP.com");
97 STARTUPINFO si = { 0 };
98 si.cb =
sizeof(STARTUPINFO);
99 si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USECOUNTCHARS;
100 si.wShowWindow = SW_HIDE;
101 si.dwXCountChars = 256;
102 si.dwYCountChars = 10000;
103 if ( ! m_exe.
Create(NULL, cl, si) )
105 cl = _T(
"WinSCP.com");
106 m_exe.
Create(NULL, cl, si);
116 % _T(
"Session started.") % _T(
"セッションを開始しました")
117 % _T(
"Authentication failed") % _T(
"認証に失敗")
118 % _T(
"to the cache?") % _T(
"ホスト鍵をキャッシュに追加")
119 % _T(
"(U)pdate") % _T(
"更新((U))");
120 cl.
Format(_T(
"open %s:%s@%s\r"), lpszUserName, lpszPassword, lpszServerName);
123 r = (r >= 0) ? (r / 2) : r;
128 r = (r >= 0) ? (r / 2) : r;
134 r = (r >= 0) ? (r / 2) : r;
139 m_currentLocalDir = ms_GetCurrentDir();
140 cl.
Format(_T(
"lcd %s\r"), ms_DQ(m_currentLocalDir));
193 cl.
Format(_T(
"mkdir %s\r"), ms_DQ(lpszRemoteDir));
206 cl.
Format(_T(
"rmdir %s\r"), ms_DQ(lpszRemoteDir));
219 CStr cl = _T(
"pwd\r");
225 if ( ! log[i].IsEmpty() && log[i][0] ==
'/' )
227 _currentRemoteDir = log[i];
244 cl.
Format(_T(
"cd %s\r"), ms_DQ(lpszRemoveDir));
256 bool GetRemoteFile(LPCTSTR lpszNewLocalFile, LPCTSTR lpszRemoteFile, DWORD to = 10000)
263 cl.
Format(_T(
"get -preservetime %s %s\r"), ms_DQ(lpszRemoteFile), ms_DQ(lpszNewLocalFile));
275 bool PutLocalFile(LPCTSTR lpszNewRemoteFile, LPCTSTR lpszLocalFile, DWORD to = 10000)
282 cl.
Format(_T(
"put -preservetime %s %s\r"), ms_DQ(lpszLocalFile), ms_DQ(lpszNewRemoteFile));
340 CStr s3 = lpszOption;
343 cl.
Format(_T(
"synchronize %s %s %s %s %s\r"), s1, s2, s3, ms_DQ(lpszLocalDir), ms_DQ(lpszRemoteDir));
352 const CStr& ss = log[i];
353 INT_PTR f = ss.
Find(_T(
'|'));
359 m_synchronizedFiles.
Add(s);
375 return m_synchronizedFiles;
387 cl.
Format(_T(
"rm %s\r"), ms_DQ(lpszFileName));
402 cl.
Format(_T(
"rename %s %s\r") , ms_DQ(lpszOldName), ms_DQ(lpszNewName));
416 cl.
Format(_T(
"ls %s\r"), ms_DQ(lpszRemoteDir));
420 WIN32_FIND_DATA f = { 0 };
426 while ( s.
Replace(_T(
" "), _T(
" ")) > 0 );
433 const CStr& attb = vs[0];
437 f.dwFileAttributes = (attb[0] ==
'd') ? FILE_ATTRIBUTE_DIRECTORY : 0;
440 f.dwFileAttributes |= FILE_ATTRIBUTE_READONLY;
443 st.
wMonth = down_cast<WORD>(ms_ToMonth(vs[6]));
444 st.
wDay = down_cast<WORD>(vs[7].
ToInt());
449 ::SystemTimeToFileTime(&st, &ft);
450 ::LocalFileTimeToFileTime(&ft, &f.ftCreationTime);
451 f.ftLastAccessTime = f.ftCreationTime;
452 f.ftLastWriteTime = f.ftCreationTime;
453 f.nFileSizeLow = vs[5].ToInt();
458 ASSERT( l != INVALID_INDEX );
472 const CStr& attb = vs[0];
476 f.dwFileAttributes = ((attb[0]|0x40) ==
'd') ? FILE_ATTRIBUTE_DIRECTORY : 0;
477 if ( (attb[1]|0x40) !=
'r' )
479 f.dwFileAttributes |= FILE_ATTRIBUTE_READONLY;
482 st.
wMonth = down_cast<WORD>(ms_ToMonth(vs[3]));
483 st.
wDay = down_cast<WORD>(vs[4].
ToInt());
488 ::SystemTimeToFileTime(&st, &ft);
489 ::LocalFileTimeToFileTime(&ft, &f.ftCreationTime);
490 f.ftLastAccessTime = f.ftCreationTime;
491 f.ftLastWriteTime = f.ftCreationTime;
492 f.nFileSizeLow = vs[2].ToInt();
497 ASSERT( l != INVALID_INDEX );
525 CStr rf = lpszRemoteFile;
532 if (
STRLIB::Compare(ls[i].cFileName, lpszRemoteFile, -1, NORM_IGNORECASE) == 0 )
612 CStr cl = lpszCommandLine;
616 CStrVector vs =
CStr(_T(
"(A)bort,")) % _T(
"中止((A))") % _T(
"No session.") % _T(
"セッションなし") % _T(
"winscp>");
618 r = (r >= 0) ? (r / 2) : r;
644 CStr cp = ms_GetCurrentDir();
645 if ( m_currentLocalDir != cp )
648 cl.
Format(_T(
"lcd %s\r"), ms_DQ(cp));
653 m_currentLocalDir = cp;
660 static CStr ms_GetCurrentDir(
void)
663 DWORD dwRc = ::GetCurrentDirectory(MAX_PATH, str.
GetBuffer(MAX_PATH));
665 ASSERTLIB( dwRc != 0 );
670 static CStr ms_DQ(LPCTSTR lpsz)
680 static int ms_ToMonth(LPCTSTR lpsz)
684 _T(
"jan"), _T(
"feb"), _T(
"mar"), _T(
"apr"),
685 _T(
"may"), _T(
"jun"), _T(
"jul"), _T(
"aug"),
686 _T(
"sep"), _T(
"oct"), _T(
"nov"), _T(
"dec")
689 loop ( i, countof(m) )
700 CStr m_currentLocalDir;
703 friend class CSftpSessionTest;
781 virtual bool OnStart(WIN32_FIND_DATA& _data, LPCTSTR lpszName)
787 if ( m_pSftp != NULL )
806 virtual bool OnNext(WIN32_FIND_DATA& _data)
808 if ( m_list.
GetSize() > m_pos )
810 _data = m_list[m_pos];
831 friend class CSftpFileFinderTest;
#define loop(VAR, CNT)
loop構文.
void Finish(void)
[設定] 検索終了.
void Unhook(void)
[設定] アンフック.
bool SendString(LPCTSTR lpsz)
[送信] 文字列送信.
void Terminate(void)
[設定] ターミネート.
bool Hook(DWORD processId)
[設定] フック.
const CStrVector & GetLastString(void) const
[取得] 取得文字列取得.
bool IsHooked(void) const
[確認] フック済み?
CStrVector GetString(void)
[取得] コンソール文字列取得.
void SetLastString(const CStrVector &vs)
[設定] 取得文字列設定.
bool IsAlived(void) const
[確認] プロセス生存確認.
bool WaitString(LPCTSTR lpsz, DWORD to)
[取得] 指定文字列待ち.
int WaitStringEx(const CStrVector &words, DWORD to)
[取得] 指定文字列待ち.
CStr GetFullShortName(void) const
[取得] FullShortName名取得
bool Terminate(UINT uExitCode=0)
[通知] 強制終了.
static bool EnumProcesses(CWorkMemT< DWORD > &_ids)
[取得] プロセスID一覧取得
static bool TerminateProcessId(DWORD processId, UINT uExitCode=0)
[処理] プロセス終了.
DWORD GetProcessId(void) const
[取得] プロセスID取得
bool Create(LPCTSTR lpszExecName, LPCTSTR lpszCommand, STARTUPINFO &si)
[実行] プロセス実行
bool IsAlive(void) const
[確認] 起動確認.
DWORD WaitForExit(DWORD dwWait=INFINITE)
[処理] 終了待ち.
CSftpFileFinder(void)
コンストラクタ
virtual ~CSftpFileFinder(void)
デストラクタ
void Initialize(CSftpSession *pSftp)
[設定] 初期化
virtual void OnFinish(void)
[通知] 検索終了通知
virtual bool OnStart(WIN32_FIND_DATA &_data, LPCTSTR lpszName)
[通知] 検索開始通知
virtual bool OnNext(WIN32_FIND_DATA &_data)
[通知] 次検索通知
bool GetRemoteFile(LPCTSTR lpszNewLocalFile, LPCTSTR lpszRemoteFile, DWORD to=10000)
[取得] リモートファイル取得.
bool PutLocalFile(LPCTSTR lpszNewRemoteFile, LPCTSTR lpszLocalFile, DWORD to=10000)
[送信] ローカルファイル送信.
bool Synchronize(LPCTSTR lpszRemoteDir, LPCTSTR lpszLocalDir, ESyncMode mode, ESyncCriteria criteria=SyncCriteria_Both, DWORD to=10000, LPCTSTR lpszOption=NULL)
[同期] ローカルとリモートの同期.
bool CreateRemoteDir(LPCTSTR lpszRemoteDir)
[作成] リモートディレクトリ作成.
CSftpSession(LPCTSTR lpszWinScpPath=NULL)
コンストラクタ.
@ SyncCriteria_Size
ファイルサイズ
@ SyncMode_Local
リモートからローカルへの同期
@ SyncMode_Remote
ローカルからリモートへの同期
~CSftpSession(void)
デストラクタ
bool ExistRemoteFile(WIN32_FIND_DATA &_fd, LPCTSTR lpszRemoteFile)
[確認] ファイル有無.
bool GetCurrentRemoteDir(CStr &_currentRemoteDir)
[取得] カレントリモートディレクトリ取得.
bool RenameRemoteFile(LPCTSTR lpszOldName, LPCTSTR lpszNewName)
[変更] 名前変更.
bool IsValid(void) const
[確認] ハンドル有効確認
const CStrVector & GetLastString(void) const
[取得] 取得文字列取得.
bool SftpCommand(LPCTSTR lpszCommandLine, DWORD to=1000)
[実行] SFTP コマンドライン実行.
bool ExistRemoteFile(LPCTSTR lpszRemoteFile)
[確認] ファイル有無.
const CStrVector & GetSynchronizedFiles(void) const
[取得] 同期結果ファイル名取得.
void Close(void)
[設定] クローズ.
bool AdjustCurrentLocalDir(void)
[実行] カレントローカルディレクトリ調整.
void SetLastString(const CStrVector &vs)
[設定] 取得文字列設定.
bool RemoveRemoteDir(LPCTSTR lpszRemoteDir)
[削除] リモートディレクトリ削除.
bool Open(LPCTSTR lpszServerName, LPCTSTR lpszUserName, LPCTSTR lpszPassword, DWORD to=10000)
[設定] オープン.
bool EnumRemoteFiles(CWorkMemT< WIN32_FIND_DATA > &_ls, LPCTSTR lpszRemoteDir=NULL)
[取得] ファイル一覧.
static void TerminateWinscp(void)
[設定] 強制終了 WinSCP.
bool SetCurrentRemoteDir(LPCTSTR lpszRemoveDir)
[設定] カレントリモートディレクトリ設定.
bool DeleteRemoteFile(LPCTSTR lpszFileName)
[削除] 指定リモートファイル削除.
static CVectorT< CStrT< TYP > > SeparatePeriod(const TYP *lpsz, const TYP *lpszMark, bool isCheckDc=true)
[取得] トークン区切取得
bool IsEmpty(void) const
[確認] 空チェック
CStrT Left(size_t iSize) const
[作成] 範囲取得.
void ReleaseBuffer(void)
[操作] 割り当てたバッファを開放.
size_t GetLength(void) const
[取得] 文字列長
INT_PTR Find(TYP t, INDEX iFromIndex=0) const
[確認] 検索.
CStrT & TrimRight(TYP t=' ')
[処理] 末尾から文字をトリム.
bool IsEqual(const TYP *lpszSubject) const
[確認] 文字列比較
CStrT & Trim(TYP t=' ')
[処理] 両端から文字をトリム.
int Replace(TYP tOld, TYP tNew)
[処理] 文字置換.
CStrT Sandwich(const TYP *lpszBefore, const TYP *lpszAfter) const
[作成] 前後連結.
void Format(const TYP *lpszFormat,...)
[代入] 書式付き文字列代入.
CStrT Mid(INDEX iOffset, size_t iSize=INVALID_SIZE) const
[作成] 範囲取得.
TYP * GetBuffer(size_t iLength=0)
[操作] 書き込みバッファ要求.
virtual size_t GetSize(void) const
[取得] サイズ取得
virtual bool RemoveAll(void)
[削除] 空化
virtual INDEX Add(const TYP &t)
[追加] 要素一つ追加.
size_t GetSize(void) const
[取得] サイズ取得
void Resize(size_t l)
[設定] サイズ再設定
int Compare(LPCSTR P1, LPCSTR P2, INT_PTR len=-1, DWORD dwCmpFlags=0)
[比較] 文字列比較(ASCII/SJIS用)
size_t GetLen(LPCSTR lpsz)
[計算] 文字列長計算(ASCII/SJIS用)
TNB::CStrT< TCHAR > CStr
文字列クラス
CAscii LowerString(LPCSTR lpsz)
[変換] 小文字変換(ASCII/SJIS用)
void Copy(LPSTR _dst, LPCSTR src)
[複製] 文字列コピー(ASCII/SJIS用)
int ToInt(LPCSTR lpsz, int iBase=10)
[変換] INT変換(ASCII/SJIS用).
void IgnoreUnusedValue(const T &value)
[宣言] 参照しない値宣言.