青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

春暖花開
雪化了,花開了,春天來了
posts - 149,comments - 125,trackbacks - 0

發(fā)現(xiàn)許久沒有來園子里逛了,一來是工作了,的確很忙,二來是手的確有點懶。想寫點東西,找來找去,還是對這個園子有感情。

最近發(fā)現(xiàn)懶惰真的是一個很容易養(yǎng)成的習(xí)慣,它會慢慢吞噬掉一切。就項目而言,壓力的確比學(xué)生時要繁重許多,但條理性似乎更加重要。隨手記下,隨時總結(jié)總歸是好的,一個回頭,就不知道什么是時候是個頭了。

所以半年多的經(jīng)驗來看,一定要及時的總結(jié)項目,要把最新鮮的,最熱氣騰騰的東西記錄下來。
對自己回顧是一個幫助,對他人入門也是個捷徑。

養(yǎng)成及時總結(jié)的習(xí)慣很重要。

posted @ 2010-11-16 23:34 Sandy 閱讀(382) | 評論 (0)編輯 收藏
今天是一個非常開心的日子,我拿到了我夢寐以求的一家公司的offer,可以繼續(xù)沿著夢想的道路繼續(xù)前進,開心。

首先感謝默默支持我的人,在這一路尋找的路上,有過很多挫折,謝謝他們給我的力量,讓我越挫越勇。

其次感謝一次次面試中給了我很多幫助的面試官,其實面試是一個互相學(xué)習(xí)的機會,而且每一次的肯定都是對能力的一種肯定,給了我很多信心。最后可能由于各種原因,與一些公司擦肩而過,也衷心祝愿這些公司的發(fā)展越來越好。

最后感謝給了我很多建議的人,讓我一路堅持夢想的走下來。 軟件開發(fā),是我熱愛的一個方向,我也希望能夠沿著這條路繼續(xù)走下去。






小小廣告,如果你的網(wǎng)絡(luò)很慢,不妨試試Opera的Turbo加速,不一般的體驗??!
posted @ 2009-12-21 22:29 Sandy 閱讀(533) | 評論 (3)編輯 收藏
摘自:
http://liuaigui.blog.sohu.com/86494742.html

線程安全的(Thread-Safe):如果一個函數(shù)在同一時刻可以被多個線程安全地調(diào)用,就稱該函數(shù)是線程安全的。線程安全函數(shù)解決多個線程調(diào)用函數(shù)時訪問共享資源的沖突問題。

可重入(Reentrant):函數(shù)可以由多于一個線程并發(fā)使用,而不必?fù)?dān)心數(shù)據(jù)錯誤??芍厝牒瘮?shù)可以在任意時刻被中斷,稍后再繼續(xù)運行,不會丟失數(shù)據(jù)??芍厝胄越鉀Q函數(shù)運行結(jié)果的確定性和可重復(fù)性??芍厝牒瘮?shù)編寫規(guī)范為:
1、不在函數(shù)內(nèi)部使用靜態(tài)或全局?jǐn)?shù)據(jù)
2、不返回靜態(tài)或全局?jǐn)?shù)據(jù),所有數(shù)據(jù)都由函數(shù)的調(diào)用者提供。
3、使用本地數(shù)據(jù),或者通過制作全局?jǐn)?shù)據(jù)的本地拷貝來保護全局?jǐn)?shù)據(jù)。
4、如果必須訪問全局變量,利用互斥機制來保護全局變量。
5、不調(diào)用不可重入函數(shù)。

兩者之間的關(guān)系:
1、一個函數(shù)對于多個線程是可重入的,則這個函數(shù)是線程安全的。
2、一個函數(shù)是線程安全的,但并不一定是可重入的。
3、可重入性要強于線程安全性。

比如:strtok函數(shù)是既不可重入的,也不是線程安全的。加鎖的strtok不是可重入的,但線程安全。而strtok_r既是可重入的,也是線程安全的

之所以會去查這個問題,是在考試中遇到過考strtok這個問題是否可用于多線程。自己從使用的角度上感覺不安全,但是究其原因卻不是很明白。查了一下,居然涉及到函數(shù)的線程安全。

在另一篇博文中,是這樣解釋的:
strtok不是一個線程安全的函數(shù)。因為根據(jù)其定義,它必須使用內(nèi)部靜態(tài)變量來記錄字符串中下一個需要解析的標(biāo)記的當(dāng)前位置。但是,由于指示這個位置的變量只有一個,那么,在同一個程序中出現(xiàn)多個解析不同字符串的strtok調(diào)用時,各自的字符串的解析就會互相干擾。(摘自: http://hi.baidu.com/pigfanfan/blog/item/72816c958d63e743d1135ebf.html

怎么避免呢?
我們可以利用另一個函數(shù):strtok_r,這個是一個線程安全的函數(shù)——strtok_r,以此來代替strtok。
posted @ 2009-10-22 17:33 Sandy 閱讀(1616) | 評論 (0)編輯 收藏
 轉(zhuǎn):C++ pair用法
摘自:http://hi.baidu.com/lucene1983/blog/item/83bb68351d12ffbed1a2d3fe.html

1 pair的應(yīng)用

pair是將2個數(shù)據(jù)組合成一個數(shù)據(jù),當(dāng)需要這樣的需求時就可以使用pair,如stl中的map就是將key和value放在一起來保存。另一個應(yīng)用是,當(dāng)一個函數(shù)需要返回2個數(shù)據(jù)的時候,可以選擇pair。 pair的實現(xiàn)是一個結(jié)構(gòu)體,主要的兩個成員變量是first second 因為是使用struct不是class,所以可以直接使用pair的成員變量。

2 make_pair函數(shù)

template pair make_pair(T1 a, T2 b) { return pair(a, b); }

很明顯,我們可以使用pair的構(gòu)造函數(shù)也可以使用make_pair來生成我們需要的pair。 一般make_pair都使用在需要pair做參數(shù)的位置,可以直接調(diào)用make_pair生成pair對象很方便,代碼也很清晰。 另一個使用的方面就是pair可以接受隱式的類型轉(zhuǎn)換,這樣可以獲得更高的靈活度。靈活度也帶來了一些問題如:

std::pair<int, float>(1, 1.1);

std::make_pair(1, 1.1);

是不同的,第一個就是float,而第2個會自己匹配成double。

以上是從網(wǎng)上找來的資料,我又查了一下關(guān)于pair的定義,其定義是一個模板結(jié)構(gòu)。
   

        // TEMPLATE STRUCT pair
template<class _Ty1,
    
class _Ty2> struct pair
    
{    // store a pair of values
    typedef pair<_Ty1, _Ty2> _Myt;
    typedef _Ty1 first_type;
    typedef _Ty2 second_type;

    pair()
        : first(_Ty1()), second(_Ty2())
        
{    // construct from defaults
        }


    pair(
const _Ty1& _Val1, const _Ty2& _Val2)
        : first(_Val1), second(_Val2)
        
{    // construct from specified values
        }


    template
<class _Other1,
        
class _Other2>
        pair(
const pair<_Other1, _Other2>& _Right)
        : first(_Right.first), second(_Right.second)
        
{    // construct from compatible pair
        }


    
void swap(_Myt& _Right)
        
{    // exchange contents with _Right
        std::swap(first, _Right.first);
        std::swap(second, _Right.second);
        }


    _Ty1 first;    
// the first stored value
    _Ty2 second;    // the second stored value
    }
;

make_pair同樣也是一個模板函數(shù)。其定義如下:
template<class _Ty1,
    
class _Ty2> inline
    pair
<_Ty1, _Ty2> make_pair(_Ty1 _Val1, _Ty2 _Val2)
    
{    // return pair composed from arguments
    return (pair<_Ty1, _Ty2>(_Val1, _Val2));
    }

posted @ 2009-10-15 11:09 Sandy 閱讀(12066) | 評論 (0)編輯 收藏

有這么一個關(guān)于虛函數(shù)和虛繼承的問題,如下:
class A
{
    char k[3];
public:
    virtual void aa();
};

class B: public virtual A
{
    char j[3];
public:
    virtual void bb();
};

class C: public virtual B
{
    char i[3];
public:
   virtual void cc();
};
請問sizeof(A), sizeof(B), sizeof(C)分別為多少?

對于A, 我們很清楚的知道,其大小為8。
對于B,考慮到虛繼承和自身的虛函數(shù),我們也可以算出來起大小為8+8+4 = 20
對于C,其大小為20+8+4 = 32。
其中 4為虛繼承所占用的指針。

這個看上去沒有什么問題。但是當(dāng)我把虛繼承去掉以后,這里卻有了一些變化?
首先,我猜想了一下,A是8,B是16,C是24。
可惜結(jié)果和我想的不一樣,答案是8, 12, 16。很有規(guī)律的一個數(shù)字。
從A到B,只增加了4。什么原因呢?

http://www.diybl.com/course/3_program/c++/cppjs/2007927/74925.html這里介紹了一些

The existence of virtual function(s)

Existence of virtual function(s) will add 4 bytes of virtual table pointer in the class, which will be added to size of class. Again, in this case, if the base class of the class already has virtual function(s) either directly or through its base class, then this additional virtual function won't add anything to the size of the class. Virtual table pointer will be common across the class hierarchy. That is

class Base {

public:

 ...        

virtual void SomeFunction(...);

private:  

int iAMem

};

class Derived : public Base

{

 ...       

 virtual void SomeOtherFunction(...);

private:      

int iBMem

};

In the example above, sizeof(Base) will be 8 bytes--that is sizeof(int iAMem) + sizeof(vptr). sizeof(Derived) will be 12 bytes, that is sizeof(int iBMem) + sizeof(Derived). Notice that the existence of virtual functions in class Derived won't add anything more. Now Derived will set the vptr to its own virtual function table.


派生類和基類擁有相同的虛函數(shù)表。

但似乎虛繼承的時候,又?jǐn)P棄了這一做法。

所以兩個是有所區(qū)別的。

posted @ 2009-10-07 22:43 Sandy 閱讀(1977) | 評論 (2)編輯 收藏

今天在看面試寶典,注意到上面所說浮點數(shù)在內(nèi)存里和整數(shù)的存儲方式不同,但究竟有何不同呢?
在網(wǎng)上搜了一下:
http://blog.csdn.net/djsl6071/archive/2007/03/16/1531336.aspx中介紹了浮點數(shù)在內(nèi)存中的存儲方式,覺得不錯,轉(zhuǎn)過來。

浮點數(shù)在內(nèi)存中的存儲方式

浮點數(shù)保存的字節(jié)格式如下:

地址        +0          +1           +2           +3
內(nèi)容    SEEE EEEE   EMMM MMMM    MMMM MMMM    MMMM MMMM

這里
S 代表符號位,1是負(fù),0是正
E 偏移127的冪,二進制階碼=(EEEEEEEE)-127。
M 24位的尾數(shù)保存在23位中,只存儲23位,最高位固定為1。此方法用最較少的位數(shù)實現(xiàn)了
較高的有效位數(shù),提高了精度。

零是一個特定值,冪是0 尾數(shù)也是0。

浮點數(shù)-12.5作為一個十六進制數(shù)0xC1480000保存在存儲區(qū)中,這個值如下:
地址 +0     +1     +2     +3
內(nèi)容0xC1   0x48   0x00   0x00

浮點數(shù)和十六進制等效保存值之間的轉(zhuǎn)換相當(dāng)簡單。下面的例子說明上面的值-12.5如何轉(zhuǎn)
換。
浮點保存值不是一個直接的格式,要轉(zhuǎn)換為一個浮點數(shù),位必須按上面的浮點數(shù)保存格式表
所列的那樣分開,例如:

地址       +0           +1            +2            +3
格式   SEEE EEEE    EMMM MMMM     MMMM MMMM     MMMM MMMM
二進制  11000001     01001000      00000000      00000000
十六進制   C1           48            00            00

從這個例子可以得到下面的信息:
  符號位是1 表示一個負(fù)數(shù)
  冪是二進制10000010或十進制130,130減去127是3,就是實際的冪。
  尾數(shù)是后面的二進制數(shù)10010000000000000000000
在尾數(shù)的左邊有一個省略的小數(shù)點和1,這個1在浮點數(shù)的保存中經(jīng)常省略,加上一個1和小數(shù)
點到尾數(shù)的開頭,得到尾數(shù)值如下:
1.10010000000000000000000

接著,根據(jù)指數(shù)調(diào)整尾數(shù).一個負(fù)的指數(shù)向左移動小數(shù)點.一個正的指數(shù)向右移動小數(shù)點.因為
指數(shù)是3,尾數(shù)調(diào)整如下:
1100.10000000000000000000

結(jié)果是一個二進制浮點數(shù),小數(shù)點左邊的二進制數(shù)代表所處位置的2的冪,例如:1100表示
(1*2^3)+(1*2^2)+(0*2^1)+(0*2^0)=12。
小數(shù)點的右邊也代表所處位置的2的冪,只是冪是負(fù)的。例如:.100...表示(1*2^(-1))+
(0*2^(-2))+(0*2^(-2))...=0.5。
這些值的和是12.5。因為設(shè)置的符號位表示這數(shù)是負(fù)的,因此十六進制值0xC1480000表示-
12.5。

關(guān)于多字節(jié)數(shù)據(jù)類型在內(nèi)存中的存儲問題


int ,short 分別是4、2字節(jié)。他們在內(nèi)存中的存儲方式下面舉個例子說明。

int data = 0xf4f3f2f1;
其中低位存放在編址小的內(nèi)存單元,高位存放在編址高的內(nèi)存單元
如下:
地址:0x8000      0x8001    0x8002   0x8003
數(shù)據(jù):   f1              f2            f3          f4
根據(jù)IEEE在1985年制定的標(biāo)準(zhǔn)來處理浮點數(shù)
單精度浮點數(shù)用4字節(jié),包括1位符號位s(整數(shù)為0,負(fù)數(shù)為1),8位指數(shù)位e,23位有效位f
浮點型使用的是科學(xué)計數(shù)法,比如十進制的12345可以表示為1.2345 * 10^4(表示10的4次冪)
用二進制表示為 1.1000000111001 * 2^13
所以計算機中用浮點數(shù)表示12345這個十進制應(yīng)該是這樣的,s位為0,因為是正數(shù),指數(shù)位為13+127=140(127為單精度浮點數(shù)偏移值,為了表示只有小數(shù)部分的數(shù)),有效位為1000000111001
計算的時候用 (-1)^s * 1.f * 2^(e-127) ,結(jié)果就是 1* 1.1000000111001 * 2^(140-127=13) ,和我們剛才表示的一樣
還比如,十進制小數(shù)0.125轉(zhuǎn)換為二進制小數(shù)0.001可以表示為 1* 1.0 * 2^(124-127=-3)
double,雙精度浮點數(shù)有1位符號位、11位指數(shù)位和52位有效數(shù)
謝謝,和我找的資料差不多:)
知道公式
n=(-1)^s*m*2^e
e=|E|-bias
bias = 2^(k-1)-1(k為E的位數(shù))
m=|1.M|


知道12345在內(nèi)存中的10進制表示以后
0x4640e400 = 0(100 0110 0)<100 0000 1110 0100 0000>
括號中的數(shù)字為|E| = 140 所以e=140-127=13
尖括號中的數(shù)字為m=|1.M|=|1.100000011100100|=1.506958008
ok,
代入公式n = (-1)^0*1.506958008*2^13=12345
完工??!

 

本文來自CSDN博客,轉(zhuǎn)載請標(biāo)明出處:http://blog.csdn.net/edivista/archive/2009/06/07/4248794.aspx

 

本文來自CSDN博客,轉(zhuǎn)載請標(biāo)明出處:http://blog.csdn.net/edivista/archive/2009/06/07/4248794.aspx

posted @ 2009-10-02 20:51 Sandy 閱讀(1091) | 評論 (0)編輯 收藏

        DLL, 動態(tài)鏈接庫, Dynamic-link library.一直以來都是Windows操作系統(tǒng)的基石。Window應(yīng)用程序編程接口提供的所有函數(shù)都包含在DLL中。其中三個最重要的DLL分別是Kernel32.dll,User32.dll,GDI32.dll。Kernel32.dll ,包含的函數(shù)用來管理內(nèi)存、進程以及線程;User32.dll包含的函數(shù)用來執(zhí)行與用戶界面相關(guān)的任務(wù),如創(chuàng)建窗口和發(fā)送消息。GDI32.dll,包含的函數(shù)用來繪制圖像和顯示文字。Windows Mobile中重要的DLL是Coredll.dll.

         Windows系統(tǒng)廣泛使用DLL,那么我們使用DLL的理由是什么?下面是在《Windows 核心編程中》摘錄的一部分:
         一是擴展了應(yīng)用程序的特性;
          二是簡化了項目的管理;
          三是有助于節(jié)省內(nèi)存;
          四是促進了資源的共享;
          五是促進了本地化;
         六是有助于解決平臺間的差異;
         七是可以用于特殊目的。 
         目前用到的地方在 節(jié)省內(nèi)存、資源共享、本地化、特殊目的。這幾個是我在項目中見過的。DLL如何使用呢?一般有兩種方法,一是隱式載入時鏈接(implicit load-time linking)和顯示運行時鏈接(explicit run-time linking)。
         隱式鏈接,常用的方法是將DLL的頭文件和LIB文件包含到執(zhí)行文件程序中,相應(yīng)DLL放到執(zhí)行文件對應(yīng)的目錄?;揪蚈K了。
          例如:
           DLL為MyLib.dll,其頭文件為MyLib.h, LIB文件為MyLib.lib。
           我們在執(zhí)行文件中使用是,需要做如下操作:
           #include "MyLib.h"
           #pragma comment(lib, "MyLib.lib")

           即可實現(xiàn)隱式調(diào)用,變量、函數(shù)、類就可實現(xiàn)調(diào)用。
           這里lib文件非常小,它并不包含任何函數(shù)或變量,它只是列出了所有被導(dǎo)出的函數(shù)和變量的變量名,具體的實現(xiàn)在dll文件中。編譯階段不包含Lib文件會出錯的。
         顯示鏈接,在應(yīng)用程序運行的過程中,顯示地載入所需的DLL。
         一般可以使用LoadLibrary和FreeLibrary來實現(xiàn)加載和卸載DLL。那么如何判斷一個DLL是否已經(jīng)被映射到了進程的地址空間中?我們可以使用GetModuleHandle.
          如:
           HMODULE hInstDll = GetModuleHandle(TEXT("MyLib"));
           if (hInstDll == NULL)
           {
                hInstDll = LoadLibrary(TEXT("MyLib"));
            }
           我們已經(jīng)知道如何顯示加載DLL,那如何顯示調(diào)用其中的變量、函數(shù)、類呢?
          例如在DLL中,我們有一個變量 g_nResult, 函數(shù)Add,我們在執(zhí)行程序中如何調(diào)用呢?可以利用GetProcAddress。
           對于變量:
           int nResult =*(int*)GetProcAddress(hInstDll, "g_nResult");
           對于函數(shù):
            typedef   int   (*FUNC)(int, int); 
            FUNC pfn = (FUNC)GetProcAddress(hInstDll, "Add");

           這是今天學(xué)習(xí)到的關(guān)于DLL的一點知識。
            

posted @ 2009-10-02 16:43 Sandy 閱讀(719) | 評論 (0)編輯 收藏
條款四 避免不必要的默認(rèn)構(gòu)造函數(shù)

默認(rèn)構(gòu)造函數(shù)(指沒有參數(shù)的構(gòu)造函數(shù))是指C++語言中,你不用傳參數(shù)就可以調(diào)用的構(gòu)造函數(shù)。構(gòu)造函數(shù)用于初始化對象,而默認(rèn)構(gòu)造函數(shù)可以在不依賴任何外部信息的情況下創(chuàng)建對象。

在一個完美的世界里,無需任何外部信息即可創(chuàng)建對象的類可以包含默認(rèn)構(gòu)造函數(shù),而需要額外信息來創(chuàng)建對象的類則不包含默認(rèn)構(gòu)造函數(shù)??墒俏覀兊氖澜缡遣煌昝赖?,所以我們必將一些額外的因素考慮在內(nèi)。特別地,如果一個類沒有默認(rèn)構(gòu)造函數(shù),使用這個類的時候就會有一些限制。

沒有默認(rèn)構(gòu)造函數(shù),在三種情況下它的應(yīng)用可能會出現(xiàn)問題:
第一個問題是創(chuàng)建數(shù)組的時候,通常沒有很好的辦法可以指定數(shù)組元素的構(gòu)造函數(shù)的參數(shù)。
第二個問題是沒有默認(rèn)構(gòu)造函數(shù)的類他們無法作為許多基于模板的容器類的類型參數(shù)使用。因為通常用于實例化模板的哪些類型需要提供默認(rèn)構(gòu)造函數(shù)。
第三個問題是在有虛基類的時候應(yīng)該提供默認(rèn)構(gòu)造函數(shù)還是不提供默認(rèn)構(gòu)造函數(shù)。沒有默認(rèn)構(gòu)造函數(shù)的虛基類使用起來很痛苦,這是因為虛基類的構(gòu)造函數(shù)所要求的參數(shù)必須由創(chuàng)建對象所屬的最遠的派生類所提供。

正因為這些強加于沒有默認(rèn)構(gòu)造函數(shù)的類上的重中限制,一些人認(rèn)為所有的類都應(yīng)該有默認(rèn)構(gòu)造函數(shù),即使默認(rèn)構(gòu)造函數(shù)沒有足夠的信息來完全初始化一個對象。

但是默認(rèn)構(gòu)造函數(shù)會影響類的運行效率,有時會使其他成員函數(shù)變得復(fù)雜。

如果一個類的構(gòu)造函數(shù)能夠確保所有的數(shù)據(jù)成員被正確初始化,就能避免付出一些代價。通常默認(rèn)構(gòu)造函數(shù)不提供這些保證。如果默認(rèn)構(gòu)造函數(shù)對于某些類沒有太大意義,最好避免使用他們。這給使用這種類加了一些限制,但是當(dāng)你使用它時,它可以向你保證你能很放心地相信這個類被正確得初始化,并且具有高效的效率。

說實話,這一章節(jié)我看得不是很明白。
作者在一開始,列舉了一些沒有默認(rèn)構(gòu)造函數(shù)我們可能遇到的問題,在這些問題下,進而得出默認(rèn)構(gòu)造函數(shù)所帶來的一些效率和代價困擾??磥磉€需要在實踐中仔細(xì)揣摩揣摩。



posted @ 2009-09-22 13:33 Sandy 閱讀(546) | 評論 (0)編輯 收藏

條款三 絕不要把多態(tài)應(yīng)用于數(shù)組

繼承的一大特性是,允許你通過指向基類的指針和引用來操縱派生類對象。也允許通過基類指針和引用來操縱派生類數(shù)組。

但是用基類指針操縱一個包含派生類對象的數(shù)組,就會發(fā)生各種個樣的問題,其結(jié)果往往是不確定的。

我根據(jù)書中的例子,寫了一個小程序:

#include <iostream>

using namespace std;

class BST
{
public:
    BST()
    
{
        i 
= 0;
    }

    
int i;
}
;

class BalancedBST: public BST
{
private:
    
int j;
}
;

void printBSTArray(ostream& outconst BST arr[], int numElements)
{
    
for (int i = 0; i < numElements; i++)
    
{
        
out << arr[i].i << endl;
    }

}


int main()
{
    cout 
<< "BST.\n";
    BST BSTArray[
10];
    printBSTArray(cout, BSTArray, 
10);

    cout 
<< "BalancedBST.\n";
    BalancedBST bBSTArray[
10];
    printBSTArray(cout, bBSTArray, 
10);

    system(
"pause");

    
return 0;
}


其結(jié)果如下:

 

 可以看到程序并不如我們所期望的那樣,這說明什么呢?
 arr[i],表示的是*(arr+i),但是arr+i所指向的地址偏離arr所指向的地址是i*(an object in the array)。
因為參數(shù)被聲明為BST數(shù)組類型,那么數(shù)組的每個元素必須是BST,那么它們的間隔也畢定是i*sizeof(BST)。如果傳入BalancedBST數(shù)組,編譯器可能就會犯錯誤,在這種情況下,編譯器就會假定數(shù)組里每個對象的大小都和BST的大小一樣。而通常派生類要比基類有更多的成員變量,所以派生類一般都比基類對象大。所以我們就看到了如上的結(jié)果。

 試圖通過一個基類指針刪除一個包含派生類對象的數(shù)組,也會有同樣的問題。

所以不要把多臺應(yīng)用到數(shù)組上,還是很有好處的。

posted @ 2009-09-22 11:57 Sandy 閱讀(370) | 評論 (0)編輯 收藏

昨天想做這么一個操作,就是將文件從一個文件夾拷貝到另一個文件夾中,同時刪除源文件夾中的內(nèi)容。想著挺簡單的,于是就首先使用了MoveFile。
當(dāng)目的文件夾中,不存在文件時,MoveFile成功。而當(dāng)目的文件夾包含該文件時,MoveFile則調(diào)用不成功。他不支持覆蓋。所以挪動文件,用MoveFile似乎不是首選。
此時,我想到的是DeleteAndRenameFile,
在SDK中解釋到This function deletes the source file after it copies the content of the source file to the destination file. 拷貝源文件的內(nèi)容到目的文件,然后刪除源文件??此品弦螅撬笳{(diào)用該函數(shù)的時候目的文件必須存在。

這兩個函數(shù)都不可行,結(jié)合起來到是不錯的選擇,可以滿足要求??上易蛱鞗]有這么想,昨天我想到了CopyFile。
CopyFile的原型是
BOOL CopyFile(
  LPCTSTR lpExistingFileName,
  LPCTSTR lpNewFileName,
  BOOL bFailIfExists
);

最后一個參數(shù)表示當(dāng)目的文件已經(jīng)存在的時候,CopyFile調(diào)用成功還是失敗的操作。如果為False,就可以覆蓋拷貝了。

于是我就自己寫了一個CopyAndDel的小函數(shù)。先拷貝再刪除原來的文件。刪除文件的時候還需要考慮一下文件屬性的問題。

BOOL CopyAndDel(LPCTSTR lpExistingFileName, LPCTSTR lpNewFileName)
{
    
if (CopyFile(lpExistingFileName, lpNewFileName, FALSE))
    
{
        
if (!DeleteFile(lpExistingFileName))
        
{
            SetFileAttributes(lpExistingFileName, FILE_ATTRIBUTE_NORMAL);
            
return DeleteFile(lpExistingFileName);
        }

        
return TRUE;
    }

    
return FALSE;
}


這個小函數(shù)的缺陷在于還需要考慮刪除文件的屬性問題。似乎利用MoveFile和DeleteAndRenameFile組合更好一些。

這里總結(jié)一下:
MoveFile 重命名一個文件或目錄,包括它所有的孩子。可對文件夾進行操作。不過需要保證的是新文件或新文件夾不存在,否則調(diào)用失敗。
DeleteAndRenameFile 當(dāng)拷貝源文件的內(nèi)容到目的文件后,刪除源文件。需要保證目的文件在調(diào)用前已經(jīng)存在。
CopyFile 拷貝一個已經(jīng)存在的文件,并生成一個新的文件。不能對文件夾進行操作。
DeleteFile 刪除一個文件。不能刪除文件夾。該函數(shù)刪除失敗的時候,考慮一下文件的屬性問題。
RemoveDirectory 刪除一個空的文件夾。

 

posted @ 2009-09-17 09:38 Sandy 閱讀(7506) | 評論 (3)編輯 收藏
僅列出標(biāo)題
共15頁: 1 2 3 4 5 6 7 8 9 Last 
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久影视三级福利片| 国产精品日本一区二区| 亚洲精品国产精品国产自| 久久爱www久久做| 亚洲欧美成人一区二区三区| 一区二区高清在线| 一区二区三区 在线观看视| 一区二区av在线| 午夜精品久久久| 久久久97精品| 欧美国产精品一区| 亚洲区欧美区| 亚洲免费在线看| 久久青草福利网站| 欧美日韩免费看| 国产精品一区久久久久| 在线播放日韩欧美| 夜夜嗨av一区二区三区| 欧美在线观看一区二区| 免费国产一区二区| 日韩视频一区二区在线观看 | 欧美日韩精品不卡| 国产精品亚洲欧美| 好看的av在线不卡观看| 最新日韩中文字幕| 午夜国产精品视频| 嫩草成人www欧美| 夜夜嗨av一区二区三区中文字幕 | 国产精品一区二区女厕厕| 国产乱码精品一区二区三区不卡| 精品91在线| 午夜精品久久久久久久男人的天堂| 久久久亚洲综合| 亚洲理论电影网| 久久欧美中文字幕| 国产精品乱码一区二区三区| 在线欧美日韩| 亚欧美中日韩视频| 亚洲黄页一区| 久久久人成影片一区二区三区观看| 欧美日韩综合在线| 亚洲欧洲三级| 浪潮色综合久久天堂| 亚洲一区二区三区视频| 欧美a一区二区| 精品99一区二区| 欧美亚洲一区二区在线观看| 亚洲欧洲精品一区二区三区波多野1战4| 亚洲女爱视频在线| 欧美亚州一区二区三区| 亚洲精品色图| 免费欧美视频| 久久久久久黄| 狠狠色伊人亚洲综合网站色| 欧美一区二区三区在线| 99视频+国产日韩欧美| 嫩模写真一区二区三区三州| 激情av一区| 老巨人导航500精品| 欧美影院视频| 国产亚洲aⅴaaaaaa毛片| 欧美一级大片在线免费观看| 亚洲视频精选在线| 欧美视频在线观看 亚洲欧| 99精品视频网| 99国产精品久久久久久久久久| 欧美人成在线| 国产精品99久久不卡二区| 亚洲欧洲三级电影| 欧美日本韩国在线| 中国亚洲黄色| 亚洲一区二区三区高清不卡| 国产精品丝袜xxxxxxx| 欧美在线黄色| 久久精品亚洲一区二区| 亚洲国产精品激情在线观看| 亚洲国产一区在线| 欧美日韩久久不卡| 午夜久久一区| 久久精品三级| 日韩一级免费| 亚洲综合视频一区| 国产在线欧美| 亚洲第一毛片| 国产精品二区在线| 久久精品国产精品| 美日韩精品视频| 在线一区二区三区四区| 亚洲欧美亚洲| 亚洲国产精品久久91精品| 亚洲国产91| 国产精品久久久久永久免费观看| 久久av老司机精品网站导航 | 欧美日韩免费观看一区三区| 一区二区三区成人精品| 亚洲永久字幕| 亚洲国产高潮在线观看| 夜夜夜精品看看| 国内精品久久久| 91久久一区二区| 国产日韩欧美另类| 亚洲经典一区| 国产亚洲精品久| 亚洲经典在线看| 国产在线一区二区三区四区 | 亚洲电影观看| 日韩午夜视频在线观看| 国产日韩综合| 亚洲激情啪啪| 黄网站免费久久| 亚洲一级片在线观看| 欧美在线播放| 午夜精品久久久久久久蜜桃app | 亚洲片国产一区一级在线观看| 国产欧美日本一区视频| 亚洲精品免费观看| 韩曰欧美视频免费观看| 一区二区三区不卡视频在线观看 | 亚洲一级在线观看| 久热国产精品视频| 久久se精品一区精品二区| 欧美成人一区二区| 久久野战av| 国产视频欧美| 亚洲小少妇裸体bbw| 亚洲麻豆视频| 欧美xx视频| 欧美bbbxxxxx| 好看的亚洲午夜视频在线| 亚洲欧美日韩精品| 亚洲手机在线| 欧美巨乳在线| 亚洲国产欧美国产综合一区| 经典三级久久| 欧美一级专区免费大片| 午夜天堂精品久久久久| 国产精品海角社区在线观看| 日韩视频免费| 亚洲永久免费观看| 欧美三区视频| 亚洲一区二区视频| 欧美一区二区国产| 国产精品一二一区| 亚洲欧美偷拍卡通变态| 新67194成人永久网站| 国产精品免费一区豆花| 亚洲欧美国产日韩天堂区| 午夜精品亚洲| 国产一区二区三区在线观看视频| 欧美一级视频免费在线观看| 久久资源av| 亚洲日本中文字幕| 欧美日韩免费观看一区二区三区 | 亚洲欧洲日本在线| 中文高清一区| 国产精品视频免费| 午夜综合激情| 免费在线观看一区二区| 亚洲欧洲精品一区二区| 欧美精品激情| 亚洲欧美成人在线| 你懂的成人av| 99国产精品久久久久久久久久| 欧美三级在线| 久久精品噜噜噜成人av农村| 亚洲电影天堂av| 亚洲欧美电影在线观看| 国模大胆一区二区三区| 欧美激情区在线播放| 一区二区av| 久热成人在线视频| 一本色道久久综合亚洲精品小说 | 日韩视频欧美视频| 国产精品日韩一区二区三区| 久久综合给合| 中文在线一区| 欧美福利专区| 午夜免费久久久久| 在线观看av一区| 国产精品99一区二区| 久久深夜福利| 亚洲影院在线观看| 亚洲国产精品成人精品| 午夜精品久久久久久久99水蜜桃| 亚洲成人在线免费| 国产精品视频九色porn| 欧美大尺度在线| 欧美一级黄色录像| 亚洲另类在线一区| 蜜桃久久精品乱码一区二区| 亚洲欧美激情视频| 91久久综合| 韩日在线一区| 国产精品免费福利| 欧美喷水视频| 欧美国产日韩一二三区| 久久精品国产久精国产思思| 亚洲欧美日韩综合aⅴ视频| 亚洲精品日韩久久| 欧美国产专区|