C++檔案拷貝代碼

來源:互聯網
上載者:User
用C++些檔案拷貝程式遠遠比我想象的要困難的多,和C#僅使用的File類和Directory類相比,直接操作windows api更加有趣。這個過程讓我體會到的不僅僅是api,更多是編寫程式這一個過程的本質。先和大家分享一下My Code,還請各位C++前輩們指教。.h檔案
  1. #pragma once
  2. #include <string>
  3. #include "file.h"
  4. using namespace std;
  5. namespace Common
  6. {
  7.     namespace File
  8.     {
  9.         class SyncFolder : public Common::File::FileClass
  10.         {
  11.         private:
  12.             wstring m_sourceDirectory;
  13.             wstring m_targetDirectory;
  14.             const wstring * m_ext;
  15.             const bool * m_reverseExt;
  16.         protected:
  17.             void FileMethod(const wstring&);
  18.         public:
  19.             SyncFolder(const wstring &sourceDirectory, const wstring &targetDirectory,const wstring &ext, bool reverseExt):FileClass(),
  20.                 m_sourceDirectory(Common::File::GetSecurePath(sourceDirectory)),m_targetDirectory(Common::File::GetSecurePath(targetDirectory))
  21.             {
  22.                 m_ext = new wstring(ext);
  23.                 m_reverseExt = new bool(reverseExt);
  24.             }
  25.             ~SyncFolder(void)
  26.             {
  27.                 delete m_ext;
  28.                 delete m_reverseExt;
  29.             }
  30.             void Exec();
  31.         };
  32.     }
  33. }

.cpp檔案

  1. #include "StdAfx.h"
  2. #include "SyncFolder.h"
  3. #include "File.h"
  4. void Common::File::SyncFolder::Exec()
  5. {
  6.     ReadFiles(m_sourceDirectory, *m_ext);
  7. }
  8. void Common::File::SyncFolder::FileMethod(const wstring& fileName)
  9. {
  10.     //擷取相對路徑
  11.     wstring offsetPath = 
  12.         Common::File::GetRelativePath(m_sourceDirectory, 
  13.             Common::File::GetPathFromFilePath(fileName));
  14.     //擷取新路徑
  15.     wstring targetFilePath;
  16.     if(offsetPath.empty())
  17.         targetFilePath = m_targetDirectory;
  18.     else
  19.         targetFilePath = m_targetDirectory + L"//" + offsetPath;
  20.     //建立檔案夾
  21.     Common::File::CreatePath(targetFilePath);
  22.     //建立新檔案路徑
  23.     wstring newFileName = targetFilePath + L"//" + Common::File::GetFileNameFromFilePath(fileName);
  24.     //複製檔案
  25.     CopyFile(fileName.c_str(), newFileName.c_str(), true);
  26. }

其實在之前的一篇blog中,我寫了一個遍曆檔案目錄的函數( 檔案夾遍曆代碼C++(win32平台)),在這個函數的參數列表中,有一個函數指標。我的意圖是通過這個函數指標,能夠處理遍曆到的檔案。由於在C#中,可以通過delegate來聲明一個類似與函數指標的類型,然後通過該類型來定義一個對象來指向執行方法的地址,所以我也想在C++中如法炮製。可是最後C++編譯器告訴我,這種寫法是錯誤的。在C++中,函數指標指向的是一個靜態地址,如果我要將指標指向類執行個體的一個成員方法,這在C++中是不允許的(聽說boost中一個解決方案)。這讓我明白了C++和C#中相似的地方並不相同。不過這也給了我想象的空間:去想象C#編譯器是如何用delegate去實現函數指標的功能的或者說它們之間有本質的區別。另外一個很重要的體驗是,C++的開發環境遠沒有C#那麼智能(VS2008),特別是智能感知那一塊。這讓我在最開始些代碼的時候總是感到不穩,像一個醉漢走路,搖搖晃晃的。後來我發現,這種擔心源於我自己對C++編譯器的類型檢查特性沒有充分的認識。我們可以放心大膽的去寫代碼,然後compile,如果有問題,編譯器會很精確的告訴你。這種認識對重構代碼很有協助。在之後的工作中,對於那些C#代碼,我都感很放心的去重構,因為編譯器會告訴我問題出在什麼地方。也就是基於這種認識,在寫C#代碼的時候,盡量避免使用像datatable之類的類型,因為編譯器不能對其中的資料類型進行類型檢查,這樣我們也就享受不到編譯器類型檢查這項功能帶來的實惠。還有就是單元測試的工作方式。最開始寫C++代碼,每寫一行代碼我都不敢確定它的輸出結果是正確的或是什麼樣子。為瞭解決這個問題,我基本上為每個函數編寫專門的調試代碼。後來我發現這是一種不錯的工作方式,效率很高。這種工作方式就是在.net世界中的單元測試呀。總之,C++的學習讓我受益匪淺。希望能夠和大家多多交流。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.