TNB Library
TnbFtpFile.h
[詳解]
1#pragma once
11#include "TnbInternetHandle.h"
12#include "TnbWriter.h"
13#include "TnbDummyCollection.h"
14
15
16
17//TNB Library
18namespace TNB
19{
20
21
22
36{
37public:
38
41 {
42 }
43
48 CFtpSession(const CFtpSession& other) : m_hWininet(other.m_hWininet), m_hSession(other.m_hSession)
49 {
50 }
51
58 {
59 m_hWininet = other.m_hWininet;
60 m_hSession = other.m_hSession;
61 return *this;
62 }
63
69 bool IsValid(void) const
70 {
71 return m_hSession.IsValid();
72 }
73
85 bool Open(LPCTSTR lpszAgent, LPCTSTR lpszServerName, LPCTSTR lpszUserName = NULL, LPCTSTR lpszPassword = NULL)
86 {
87 Close();
88 if ( ! m_hWininet.Open(lpszAgent, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0) )
89 {
90 return false;
91 }
92 m_hSession = m_hWininet.Connect(lpszServerName, INTERNET_DEFAULT_FTP_PORT,
93 lpszUserName, lpszPassword, INTERNET_SERVICE_FTP, 0, 0);
94 return m_hSession.IsValid();
95 }
96
101 void Close(void)
102 {
103 m_hWininet.Close();
104 m_hSession.Close();
105 }
106
111 operator CInternetHandle&(void)
112 {
113 return m_hSession;
114 }
115
122 bool CreateRemoteDir(LPCTSTR lpszRemoteDir)
123 {
124 return m_hSession.CreateDirectory(lpszRemoteDir);
125 }
126
133 bool RemoveRemoteDir(LPCTSTR lpszRemoteDir)
134 {
135 return m_hSession.RemoveDirectory(lpszRemoteDir);
136 }
137
147 bool GetCurrentRemoteDir(LPTSTR _lpszCurrentRemoteDir, DWORD& _length)
148 {
149 return m_hSession.GetCurrentDirectory(_lpszCurrentRemoteDir, &_length);
150 }
151
158 bool SetCurrentRemoteDir(LPCTSTR lpszRemoteDir)
159 {
160 return m_hSession.SetCurrentDirectory(lpszRemoteDir);
161 }
162
190 bool GetRemoteFile(LPCTSTR lpszNewLocalFile, LPCTSTR lpszRemoteFile, BOOL fFailIfExists, DWORD dwFlagsAndAttributes, DWORD dwFlags, DWORD_PTR dwContext = 0)
191 {
192 return m_hSession.GetFile(lpszRemoteFile, lpszNewLocalFile, fFailIfExists, dwFlagsAndAttributes, dwFlags, dwContext);
193 }
194
215 bool PutLocalFile(LPCTSTR lpszNewRemoteFile, LPCTSTR lpszLocalFile, DWORD dwFlags, DWORD_PTR dwContext = 0)
216 {
217 return m_hSession.PutFile(lpszLocalFile, lpszNewRemoteFile, dwFlags, dwContext);
218 }
219
226 bool DeleteRemoteFile(LPCTSTR lpszRemoteFile)
227 {
228 return m_hSession.DeleteFile(lpszRemoteFile);
229 }
230
239 bool RenameRemoteFile(LPCTSTR lpszOldName, LPCTSTR lpszNewName)
240 {
241 return m_hSession.RenameFile(lpszOldName, lpszNewName);
242 }
243
244private:
245 CInternetHandle m_hWininet;
246 CInternetHandle m_hSession;
247};
248
249
250
260{
261 DEFSUPER(IReader);
262 mutable CFtpSession m_hSession;
263 mutable CPointerHandleT<DWORD> m_phdwPointer;
264 mutable CInternetHandle m_hFile;
265 CStr m_strFileName;
266 DWORD m_dwAccess;
267 DWORD m_dwFlags;
268 DWORD_PTR m_dwContext;
269 friend class CFtpFileWriter;
270
278 size_t m_Padding(size_t size) const
279 {
280 try
281 {
283 return ReadInto(dc, size);
284 }
285 catch(CTnbException& e)
286 {
287 e.OnCatch();
288 }
289 return INVALID_SIZE;
290 }
291
296 void m_SetFilePointer(DWORD dw) const
297 {
298 m_phdwPointer = new DWORD(dw);
299 }
300
305 DWORD m_GetFilePointer(void) const
306 {
307 if ( m_phdwPointer.IsNull() )
308 {
309 return 0;
310 }
311 return *m_phdwPointer;
312 }
313
321 void m_SetParamForOpen(LPCTSTR lpszFileName, DWORD dwAccess, DWORD dwFlags, DWORD_PTR dwContext)
322 {
323 m_strFileName = lpszFileName;
324 m_dwAccess = GENERIC_READ;
325 m_dwFlags = dwFlags;
326 m_dwContext = dwContext;
327 }
328
335 bool m_Reopen(void) const
336 {
337 CInternetHandle& h = m_hSession;
338 if ( h.IsValid() )
339 {
340 m_hFile.Close();
341 m_hFile = h.OpenFile(m_strFileName, m_dwAccess, m_dwFlags, m_dwContext);
342 m_SetFilePointer(0);
343 return m_hFile.IsValid();
344 }
345 return false;
346 }
347
352 void m_AddFilePointer(DWORD dw) const
353 {
354 if ( m_phdwPointer.IsNull() )
355 {
356 m_phdwPointer = new DWORD(dw);
357 }
358 else
359 {
360 *m_phdwPointer += dw;
361 }
362 }
363
364public:
365
386 bool Open(CFtpSession& sec, LPCTSTR lpszFileName, DWORD dwFlags = FTP_TRANSFER_TYPE_BINARY, DWORD_PTR dwContext = 0)
387 {
388 Close();
389 m_hSession = sec;
390 m_SetParamForOpen(lpszFileName, GENERIC_READ, dwFlags, dwContext);
391 return m_Reopen();
392 }
393
401 virtual size_t Read(size_t size, LPVOID _P) const
402 {
403 DWORD dwRead;
404 if ( m_hFile.ReadFile(_P, ToDword(size), &dwRead) )
405 {
406 m_AddFilePointer(dwRead);
407 return dwRead;
408 }
409 throw CReadFailureException(::GetLastError());
410 }
411
416 LPCTSTR GetOpenName(void) const
417 {
418 return m_strFileName;
419 }
420
426 virtual bool CanRead(void) const
427 {
428 return m_hFile.IsValid();
429 }
430
442 LONGLONG Seek(LONGLONG llOffset, ESeekMode eSeek = TOP) const
443 {
444 INT_PTR r = -1;
445 int size = ToInt(GetSize());
446 int ofs = ToInt(llOffset);
447 DWORD current = m_GetFilePointer();
448 switch ( eSeek )
449 {
450 case TOP:
451 if ( ofs >= 0 && ofs <= size )
452 {
453 r = ofs;
454 }
455 break;
456 case CURRENT:
457 r = current + ofs;
458 if ( r > size )
459 {
460 r = -1;
461 }
462 break;
463 case END:
464 if ( (-ofs) >= 0 && (-ofs) <= size )
465 {
466 r = size + ofs;
467 }
468 break;
469 default:
470 ASSERT(false);
471 break;
472 }
473 if ( r >= 0 )
474 {
475 INT_PTR i = r - current; //現在の位置から正負の方向?
476 if ( i < 0 )
477 {
478 //== 負ならReopenする。
479 if ( ! m_Reopen() )
480 {
481 r = -1;
482 }
483 else
484 {
485 i = r;
486 }
487 }
488 if ( i > 0 )
489 {
490 r = m_Padding(i);
491 }
492 if ( r >= 0 )
493 {
494 r = m_GetFilePointer();
495 }
496 }
497 return r;
498 }
499
505 LONGLONG GetSize(void) const
506 {
507 ::SetLastError(NO_ERROR);
508 ULARGE_INTEGER r;
509 r.LowPart = m_hFile.GetFileSize(&r.HighPart);
510 if ( ::GetLastError() != NO_ERROR )
511 {
512 return -1;
513 }
514 return static_cast<LONGLONG>(r.QuadPart);
515 }
516
520 void Close(void)
521 {
522 m_hFile.Close();
523 m_hSession.Close();
524 }
525};
526
527
528
538{
539 DEFSUPER(IWriter);
540 CFtpFileReader m_ftp;
541public:
542
546 virtual void Close(void)
547 {
548 m_ftp.Close();
549 }
550
571 bool Open(CFtpSession& sec, LPCTSTR lpszFileName, DWORD dwFlags = FTP_TRANSFER_TYPE_BINARY, DWORD_PTR dwContext = 0)
572 {
573 Close();
574 m_ftp.m_hSession = sec;
575 m_ftp.m_SetParamForOpen(lpszFileName, GENERIC_READ | GENERIC_WRITE, dwFlags, dwContext);
576 return m_ftp.m_Reopen();
577 }
578
599 bool New(CFtpSession& sec, LPCTSTR lpszFileName, DWORD dwFlags = FTP_TRANSFER_TYPE_BINARY, DWORD_PTR dwContext = 0)
600 {
601 Close();
602 if ( ! sec.DeleteRemoteFile(lpszFileName) )
603 {
604 return false;
605 }
606 return Open(sec, lpszFileName, dwFlags, dwContext);
607 }
608
613 LPCTSTR GetOpenName(void) const
614 {
615 return m_ftp.m_strFileName;
616 }
617
623 virtual bool CanRead(void) const
624 {
625 return m_ftp.m_hFile.IsValid();
626 }
627
633 virtual bool CanWrite(void) const
634 {
635 return CanRead() && (m_ftp.m_dwAccess & GENERIC_WRITE) != 0;
636 }
637
645 virtual size_t Read(size_t size, LPVOID _P) const
646 {
647 return m_ftp.Read(size, _P);
648 }
649
654 virtual void SetEnd(void)
655 {
656 throw CNotSupportException();
657 }
658
665 virtual void Write(size_t size, LPCVOID P)
666 {
667 DWORD dwWriten;
668 if ( m_ftp.m_hFile.WriteFile(P, ToDword(size), &dwWriten) )
669 {
670 m_ftp.m_AddFilePointer(dwWriten);
671 if ( size == dwWriten )
672 {
673 return;
674 }
675 }
676 throw CWriteFailureException(::GetLastError());
677 }
678
690 LONGLONG Seek(LONGLONG llOffset, ESeekMode eSeek = TOP) const
691 {
692 return m_ftp.Seek(llOffset, eSeek);
693 }
694
700 virtual LONGLONG GetSize(void) const
701 {
702 return m_ftp.GetSize();
703 }
704};
705
706
707
708}; // TNB
709
710
711
ダミーコレクション関係のヘッダ
INTERNETハンドル関係のヘッダ
ファイル関係のヘッダ
FTPファイル読み込みクラス
Definition: TnbFtpFile.h:260
virtual size_t Read(size_t size, LPVOID _P) const
[取得] ファイル読み込み
Definition: TnbFtpFile.h:401
LPCTSTR GetOpenName(void) const
[取得] オープン名取得
Definition: TnbFtpFile.h:416
virtual bool CanRead(void) const
[確認] 読み込み可能か
Definition: TnbFtpFile.h:426
void Close(void)
[設定] ファイルクローズ.
Definition: TnbFtpFile.h:520
LONGLONG GetSize(void) const
[取得] サイズ取得
Definition: TnbFtpFile.h:505
LONGLONG Seek(LONGLONG llOffset, ESeekMode eSeek=TOP) const
[操作] シーク.
Definition: TnbFtpFile.h:442
bool Open(CFtpSession &sec, LPCTSTR lpszFileName, DWORD dwFlags=FTP_TRANSFER_TYPE_BINARY, DWORD_PTR dwContext=0)
[設定] ファイルオープン.
Definition: TnbFtpFile.h:386
FTPファイル書き込みクラス
Definition: TnbFtpFile.h:538
virtual size_t Read(size_t size, LPVOID _P) const
[取得] 読み込み
Definition: TnbFtpFile.h:645
LPCTSTR GetOpenName(void) const
[取得] オープン名取得
Definition: TnbFtpFile.h:613
virtual LONGLONG GetSize(void) const
[取得] サイズ取得
Definition: TnbFtpFile.h:700
virtual bool CanRead(void) const
[確認] 読み込み可能か
Definition: TnbFtpFile.h:623
virtual void Close(void)
[操作] クローズ
Definition: TnbFtpFile.h:546
virtual void Write(size_t size, LPCVOID P)
[保存] ファイル書き込み
Definition: TnbFtpFile.h:665
virtual void SetEnd(void)
[設定] EOFを指定.
Definition: TnbFtpFile.h:654
bool New(CFtpSession &sec, LPCTSTR lpszFileName, DWORD dwFlags=FTP_TRANSFER_TYPE_BINARY, DWORD_PTR dwContext=0)
[取得] ファイルオープン.
Definition: TnbFtpFile.h:599
LONGLONG Seek(LONGLONG llOffset, ESeekMode eSeek=TOP) const
[操作] シーク.
Definition: TnbFtpFile.h:690
bool Open(CFtpSession &sec, LPCTSTR lpszFileName, DWORD dwFlags=FTP_TRANSFER_TYPE_BINARY, DWORD_PTR dwContext=0)
[取得] ファイルオープン.
Definition: TnbFtpFile.h:571
virtual bool CanWrite(void) const
[確認] 書込み可能か
Definition: TnbFtpFile.h:633
FTPセッション管理クラス
Definition: TnbFtpFile.h:36
CFtpSession(void)
コンストラクタ
Definition: TnbFtpFile.h:40
CFtpSession(const CFtpSession &other)
コピーコンストラクタ
Definition: TnbFtpFile.h:48
bool Open(LPCTSTR lpszAgent, LPCTSTR lpszServerName, LPCTSTR lpszUserName=NULL, LPCTSTR lpszPassword=NULL)
[設定] オープン.
Definition: TnbFtpFile.h:85
bool PutLocalFile(LPCTSTR lpszNewRemoteFile, LPCTSTR lpszLocalFile, DWORD dwFlags, DWORD_PTR dwContext=0)
[送信] ローカルファイル送信.
Definition: TnbFtpFile.h:215
bool CreateRemoteDir(LPCTSTR lpszRemoteDir)
[作成] リモートディレクトリ作成.
Definition: TnbFtpFile.h:122
bool DeleteRemoteFile(LPCTSTR lpszRemoteFile)
[削除] リモートファイル削除.
Definition: TnbFtpFile.h:226
bool RenameRemoteFile(LPCTSTR lpszOldName, LPCTSTR lpszNewName)
[変更] 名前変更.
Definition: TnbFtpFile.h:239
bool IsValid(void) const
[確認] ハンドル有効確認
Definition: TnbFtpFile.h:69
bool GetCurrentRemoteDir(LPTSTR _lpszCurrentRemoteDir, DWORD &_length)
[取得] カレントリモートディレクトリ取得.
Definition: TnbFtpFile.h:147
void Close(void)
[設定] クローズ.
Definition: TnbFtpFile.h:101
CFtpSession & operator=(const CFtpSession &other)
[代入] コピーオペレータ
Definition: TnbFtpFile.h:57
bool RemoveRemoteDir(LPCTSTR lpszRemoteDir)
[削除] リモートディレクトリ削除.
Definition: TnbFtpFile.h:133
bool GetRemoteFile(LPCTSTR lpszNewLocalFile, LPCTSTR lpszRemoteFile, BOOL fFailIfExists, DWORD dwFlagsAndAttributes, DWORD dwFlags, DWORD_PTR dwContext=0)
[取得] リモートファイル取得.
Definition: TnbFtpFile.h:190
bool SetCurrentRemoteDir(LPCTSTR lpszRemoteDir)
[設定] カレントリモートディレクトリ設定.
Definition: TnbFtpFile.h:158
INTERNETハンドル管理クラス
CInternetHandle Connect(LPCTSTR lpszServerName, INTERNET_PORT tPort, LPCTSTR lpszUserName, LPCTSTR lpszPassword, DWORD dwService, DWORD dwFlags, DWORD_PTR dwContext=0)
[接続] 指定名サーバ接続.
bool GetFile(LPCTSTR lpszRemoteFile, LPCTSTR lpszLocalFile, BOOL fFailIfExists, DWORD dwFlagsAndAttributes, DWORD dwFlags, DWORD_PTR dwContext=0) const
[取得] ローカルへ読込み.
CInternetHandle OpenFile(LPCTSTR lpszFileName, DWORD dwAccess, DWORD dwFlags, DWORD_PTR dwContext=0)
[取得] ファイルオープン.
DWORD GetFileSize(LPDWORD _lpdwFileSizeHigh) const
[取得] ファイルサイズ取得.
bool RenameFile(LPCTSTR lpszOldFileName, LPCTSTR lpszNewFileName)
[変更] 名前変更.
bool Open(LPCTSTR lpszAgent, DWORD dwAccessType, LPCTSTR lpszProxy=NULL, LPCTSTR lpszProxyBypass=NULL, DWORD dwFlags=0)
[設定] 初期化.
bool GetCurrentDirectory(LPTSTR _lpszCurrentDirectory, LPDWORD _lpdwLength) const
[取得] カレントディレクトリ取得.
bool SetCurrentDirectory(LPCTSTR lpszDirName)
[設定] カレントディレクトリ設定.
bool IsValid(void) const
[確認] ハンドル有効確認
bool ReadFile(LPVOID _lpBuffer, DWORD dwNumberOfBytesToRead, LPDWORD _lpdwNumberOfBytesRead) const
[取得] ファイル読み込み.
bool WriteFile(LPCVOID lpBuffer, DWORD dwNumberOfBytesToWrite, LPDWORD lpdwNumberOfBytesWritten)
[出力] ファイル書き込み.
bool CreateDirectory(LPCTSTR lpszDirName)
[作成] 指定ディレクトリ作成.
void Close(void)
[設定] クローズ.
bool PutFile(LPCTSTR lpszLocalFile, LPCTSTR lpszNewRemoteFile, DWORD dwFlags, DWORD_PTR dwContext)
[送信] ローカルからファイル送信.
bool RemoveDirectory(LPCTSTR lpszDirName)
[削除] ディレクトリ削除.
bool DeleteFile(LPCTSTR lpszFileName)
[削除] 指定ファイル削除.
サポート外例外
Definition: TnbException.h:185
bool IsNull(void) const
[確認] NULLチェック
読み込み失敗発生例外
Definition: TnbException.h:241
例外ベースクラス
Definition: TnbException.h:36
void OnCatch(void) const
[表示] 内容表示
Definition: TnbException.h:69
書き込み失敗発生例外
Definition: TnbException.h:255
DWORD ToDword(LPCSTR lpsz, int iBase=10)
[変換] INT変換(ASCII/SJIS用).
Definition: TnbStrLib.h:395
int ToInt(LPCSTR lpsz, int iBase=10)
[変換] INT変換(ASCII/SJIS用).
Definition: TnbStrLib.h:367
TNB Library
Definition: TnbDoxyTitle.txt:2
読み込みインターフェース
Definition: TnbReader.h:36
CByteVector ReadInto(size_t size=0) const
[取得] 読み込み
Definition: TnbReader.h:150
ESeekMode
シークのオフセット指定モード
Definition: TnbReader.h:39
@ TOP
頭からのオフセット指定
Definition: TnbReader.h:40
@ CURRENT
現在位置からのオフセット指定
Definition: TnbReader.h:41
@ END
末からのオフセット指定
Definition: TnbReader.h:42
書き込みインターフェース
Definition: TnbWriter.h:36