日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

oracle多线程删除,请教高手:多线程访问时如何实现删除一个文件?

發布時間:2025/3/15 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle多线程删除,请教高手:多线程访问时如何实现删除一个文件? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

如下要求:

當某一線程欲刪除一個文件時,如果另外一些線程正在訪問該文件。那么這些線程仍然可以對該文件進行操作。直到所有這些線程關閉了這個文件。該文件才被刪除。也就是說,只要有一個線程還打開著這個文件,該文件的物理空間就沒有真正地被刪除。(假設是單級目錄,即只有根目錄)

結構:

////////////////////////////////////

位圖模塊

class?BitMap?{

public:

BitMap(int?nitems);?????//初始化方法,給出位圖的大小,將所有位標明未用

~BitMap();?????//析構方法

void?Mark(int?which);???//標志第which位被占用

void?Clear(int?which);??//清除第which位

bool?Test(int?which);???//測試第which位是否被占用,若是,返TRUE

int?Find();????????????//找到第一個未被占用的位,標志其被占用;

//若沒有找到,返回-1

int?NumClear();?????//返回多少位沒有被占用

void?Print();?????//打印出整個位圖(調試用)

void?FetchFrom(OpenFile?*file);?//從一個文件中讀出位圖

void?WriteBack(OpenFile?*file);?//將位圖內容寫入文件

private:

...//內部實現屬性

};

////////////////////////////////////

文件頭的定義

class?FileHeader?{

public:

bool?Allocate(BitMap?*bitMap,?int?fileSize);

//通過文件大小初始化文件頭

//根據文件大小申請磁盤空間

void?Deallocate(BitMap?*bitMap);??//將一個文件占用的數據空間釋放

//(沒有釋放文件頭占用的空間)

void?FetchFrom(int?sectorNumber);?//從磁盤扇區中取出文件頭

void?WriteBack(int?sectorNumber);?//將文件頭寫入磁盤扇區

int?ByteToSector(int?offset);?????//文件邏輯地址向物理地址的轉換

int?FileLength();??????//返回文件長度

void?Print();??????//打印文件頭信息(調試用)

private:

int?numBytes;???//文件長度(字節數)

int?numSectors;???//文件占用的扇區數

int?dataSectors[NumDirect];???//文件索引表

};

///////////////////////////////////

文件系統模塊:

class?FileSystem?{

public:

FileSystem(bool?format);??????//生成方法

bool?Create(char?*name,?int?initialSize);?//生成一個文件

OpenFile*?Open(char?*name);??????//打開一個文件

bool?Remove(char?*name);???????//刪除一個文件

void?List();//列出文件系統中所有的文件

//(實際上就是根目錄中所有的文件)

void?Print();//列出文件系統中所有的文件和它們的內容

private:

OpenFile*?freeMapFile;//位圖文件打開文件結構

OpenFile*?directoryFile;//根目錄打開文件結構

};

////////////////////////////////////

Remove方法

語法:bool?Remove?(char?*name)

參數:name:需要刪除的文件名

功能:在當前的文件系統中刪除一個已有的文件

實現:在根目錄下搜尋該文件名

1.如果沒有搜索到,返回FALSE

2.如果搜索到,打開該文件并返回打開文件控制塊

2.1.將該文件從目錄中刪除

2.2.釋放FileHeader所占用的空間

2.3.釋放文件數據塊占用的空間

2.4.將對位圖和目錄的修改寫回磁盤

返回:如果刪除成功,返回TRUE;否則返回FALSE

bool?FileSystem::Remove(char?*name)

{

Directory?*directory;

BitMap?*freeMap;

FileHeader?*fileHdr;

int?sector;

directory?=?new?Directory(NumDirEntries);

directory->FetchFrom(directoryFile);

sector?=?directory->Find(name);

if?(sector?==?-1)?{

delete?directory;

return?FALSE;?//?file?not?found

}

fileHdr?=?new?FileHeader;

fileHdr->FetchFrom(sector);

freeMap?=?new?BitMap(NumSectors);

freeMap->FetchFrom(freeMapFile);

fileHdr->Deallocate(freeMap);??//?remove?data?blocks

freeMap->Clear(sector);//?remove?header?block

directory->Remove(name);

freeMap->WriteBack(freeMapFile);//?flush?to?disk

directory->WriteBack(directoryFile);????????//?flush?to?disk

delete?fileHdr;

delete?directory;

delete?freeMap;

return?TRUE;

}

如何修改remove方法和相應的文件結構,實現上面的要求?

|

由操作系統釋放,OS知道哪些進程打開了哪些文件。

創建一個臨時文件的典型做法就是用創建方式打開一個文件,然后馬上unlink,

但你可以繼續使用這個文件句柄讀/寫,當你close后磁盤空間才被釋放。

|

unix就是這樣做的。當你刪除一個文件時,它的目錄項被馬上刪除。但是只要還有進程打開了該文件,文件所占用的磁盤塊就沒有釋放,直到最后一個進程關閉該文件,文件所占磁盤空間才釋放。

建議:多看點Unix系統的書,少看點C++的書。

|

up

|

那你首先要實現對文件的打開記數。

|

用互斥和計數器,可以參照微軟的com技術中的關于addRef和release方法

|

那你是要在核心態實現還是用戶態?

如果在核心態,根據文件系統的數據結構是可以實現的。

如果在用戶態,嘿嘿,我看夠戧。

我不了解你的什么nachos。只是隨便說說,說錯了別見怪。

總結

以上是生活随笔為你收集整理的oracle多线程删除,请教高手:多线程访问时如何实现删除一个文件?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。