国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > C > 正文

使用CFile類讀取大文件

2023-06-09 12:08:01
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

由于vc6中mfc的cfile類使用32位整型數(shù)來(lái)處理文件,所以它只支持不大于4gb的文件,若超過(guò)這個(gè)范圍的文件cfile就管不了。當(dāng)然,在微軟的.net中vc7的cfile類中已經(jīng)支持大于4gb的文件,但我們還有必要為VC6愛好者探討一下在CFile類中支持大文件的方法。

class cfile64 : public cfile
{
public:

// attributes
ulonglong getposition();


// overridables

virtual ulonglong seek(longlong loff, uint nfrom);
virtual void setlength(ulonglong dwnewlen);
ulonglong getlength() ;

virtual void lockrange(ulonglong dwpos, ulonglong dwcount);
virtual void unlockrange(ulonglong dwpos, ulonglong dwcount);

};

#include "stdafx.h"
#include "file64.h"

////////////////////////////////////////////////////////////////////////////
// cfile64 implementation

ulonglong cfile64::seek(longlong loff, uint nfrom)
{
assert_valid(this);
assert((handle)m_hfile != invalid_handle_value);
assert(nfrom == begin || nfrom == end || nfrom == current);
assert(begin == file_begin && end == file_end && current == file_current);

large_integer lioff;

lioff.quadpart = loff;
lioff.lowpart = ::setfilepointer((handle)m_hfile, lioff.lowpart, &lioff.highpart,
(dword)nfrom);
if (lioff.lowpart == (dword)-1)
if (::getlasterror() != no_error)
cfileexception::throwoserror((long)::getlasterror(), m_strfilename);

return lioff.quadpart;

}

ulonglong cfile64::getposition()
{
assert_valid(this);
assert((handle)m_hfile != invalid_handle_value);

large_integer lipos;
lipos.quadpart = 0;
lipos.lowpart = ::setfilepointer((handle)m_hfile, lipos.lowpart, &lipos.highpart , file_current);
if (lipos.lowpart == (dword)-1)
if (::getlasterror() != no_error)
cfileexception::throwoserror((long)::getlasterror(), m_strfilename);

return lipos.quadpart;
}

void cfile64::lockrange(ulonglong dwpos, ulonglong dwcount)
{
assert_valid(this);
assert((handle)m_hfile != invalid_handle_value);

ularge_integer lipos;
ularge_integer licount;

lipos.quadpart = dwpos;
licount.quadpart = dwcount;
if (!::lockfile((handle)m_hfile, lipos.lowpart, lipos.highpart, licount.lowpart,
licount.highpart))
{
cfileexception::throwoserror((long)::getlasterror(), m_strfilename);
}
}

void cfile64::unlockrange(ulonglong dwpos, ulonglong dwcount)
{
assert_valid(this);
assert((handle)m_hfile != invalid_handle_value);

ularge_integer lipos;
ularge_integer licount;

lipos.quadpart = dwpos;
licount.quadpart = dwcount;
if (!::unlockfile((handle)m_hfile, lipos.lowpart, lipos.highpart, licount.lowpart,
licount.highpart))
{
cfileexception::throwoserror((long)::getlasterror(), m_strfilename);
}
}

void cfile64::setlength(ulonglong dwnewlen)
{
assert_valid(this);
assert((handle)m_hfile != invalid_handle_value);

seek(dwnewlen, (uint)begin);

if (!::setendoffile((handle)m_hfile))
cfileexception::throwoserror((long)::getlasterror(), m_strfilename);
}

ulonglong cfile64::getlength()
{
assert_valid(this);

ularge_integer lisize;
lisize.lowpart = ::getfilesize((handle)m_hfile, &lisize.highpart);
if (lisize.lowpart == (dword)-1)
if (::getlasterror() != no_error)
cfileexception::throwoserror((long)::getlasterror(), m_strfilename);

return lisize.quadpart;
}

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

上面使用的longlong是64位整型,經(jīng)過(guò)這樣修改后,在理論上可支持的最大文件為18000000000gb。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 雅江县| 和静县| 涞水县| 安阳县| 灵宝市| 和田县| 江西省| 晋州市| 古田县| 罗甸县| 阳东县| 措勤县| 板桥市| 正宁县| 东城区| 前郭尔| 赤水市| 湛江市| 泰宁县| 乡宁县| 达孜县| 东乌珠穆沁旗| 万全县| 玉溪市| 山阴县| 三门峡市| 肥东县| 西林县| 新化县| 越西县| 南皮县| 湟中县| 介休市| 阿瓦提县| 淳安县| 曲水县| 乌审旗| 政和县| 鄯善县| 巩义市| 石屏县|