⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cfileimpwin32.cpp

📁 可以实现对邮件的加密解密以及签名
💻 CPP
字号:
/*____________________________________________________________________________
		Copyright (C) 2002 PGP Corporation
        All rights reserved.

        $Id: CFileImpWin32.cpp,v 1.6 2002/11/21 18:42:55 wjb Exp $
____________________________________________________________________________*/

#include "pgpClassesConfig.h"
#include <winioctl.h>

#include "UMath.h"
#include "CFileImpWin32.h"

_USING_PGP

// Class CFileImpWin32 member functions

CFileImpWin32::~CFileImpWin32()
{
	try
	{
		if (IsOpened())
			Close();
	}
	catch (CComboError&) { }
}

PGPUInt64 
CFileImpWin32::GetLength() const
{
	pgpAssert(IsOpened());

	ULARGE_INTEGER	liLength;
	liLength.LowPart = GetFileSize(mFileHandle, &liLength.HighPart);

	if ((liLength.LowPart == 0xFFFFFFFF) && (GetLastError() != NO_ERROR))
		THROW_ERRORS(kPGPError_FileOpFailed, GetLastError());

	return liLength.QuadPart;
}

PGPUInt64 
CFileImpWin32::GetUniqueFileId() const
{
	pgpAssert(IsOpened());

	BY_HANDLE_FILE_INFORMATION	fileInfo;

	if (!GetFileInformationByHandle(mFileHandle, &fileInfo))
		THROW_ERRORS(kPGPError_FileOpFailed, GetLastError());

	return UMath::MakeQWord(fileInfo.nFileIndexLow, fileInfo.nFileIndexHigh);
}

void 
CFileImpWin32::SetIsCompressed(PGPBoolean isCompressed)
{
	pgpAssert(IsOpened());

	PGPUInt16	compressState	= (isCompressed ? 
		COMPRESSION_FORMAT_DEFAULT : COMPRESSION_FORMAT_NONE);
	ULONG		bytesReturned;

	if (!DeviceIoControl(mFileHandle, FSCTL_SET_COMPRESSION, &compressState, 
		sizeof(compressState), NULL, 0, &bytesReturned, NULL))
	{
		THROW_ERRORS(kPGPError_FileOpFailed, GetLastError());
	}
}

void 
CFileImpWin32::SetLength(PGPUInt64 length)
{
	pgpAssert(IsOpened());

	EzSetFilePointer(length);

	if (SetEndOfFile(mFileHandle) == 0)
		THROW_ERRORS(kPGPError_FileOpFailed, GetLastError());
}

void 
CFileImpWin32::Flush()
{
	pgpAssert(IsOpened());

	if (!FlushFileBuffers(mFileHandle))
		THROW_ERRORS(kPGPError_FileOpFailed, GetLastError());
}

void 
CFileImpWin32::Open(const char *path, PGPUInt32 flags)
{
	pgpAssert(!IsOpened());
	pgpAssertStrValid(path);

	mPath.Assign(path);

	// Set access flags.
	PGPUInt32	accessMask	= GENERIC_READ;

	if (!(flags & CFile::kReadOnlyFlag))
		accessMask |= GENERIC_WRITE;

	// Set share flags.
	PGPUInt32	shareAccess	= NULL;

	if (!(flags & CFile::kDenyReadFlag))
		shareAccess |= FILE_SHARE_READ;

	if (flags & CFile::kShareWriteFlag)
		shareAccess |= FILE_SHARE_WRITE;

	// Set the create disposition.
	PGPUInt32	createDisp;

	if (flags & CFile::kCreateIfFlag)
		createDisp = OPEN_ALWAYS;
	else
		createDisp = OPEN_EXISTING;

	// Set the file flags.
	PGPUInt32	fileFlags	= FILE_FLAG_SEQUENTIAL_SCAN;

	if (flags & CFile::kNoBufferingFlag)
		fileFlags |= FILE_FLAG_NO_BUFFERING;

	// Open the file handle.
	mFileHandle = CreateFile(mPath, accessMask, shareAccess, NULL, 
		createDisp, fileFlags, NULL);

	if (mFileHandle == INVALID_HANDLE_VALUE)
		THROW_ERRORS(kPGPError_CantOpenFile, GetLastError());

	mIsOpened = TRUE;
	mOpenFlags = flags;
}

void 
CFileImpWin32::Close()
{
	pgpAssert(IsOpened());

	if (!CloseHandle(mFileHandle))
	{
		pgpAssert(FALSE);
	}

	mIsOpened	= FALSE;
	mFileHandle	= INVALID_HANDLE_VALUE;
	mOpenFlags	= CFile::kNoFlags;
}

void 
CFileImpWin32::Delete(const char *path)
{
	pgpAssertStrValid(path);

	if (!DeleteFile(path))
		THROW_ERRORS(kPGPError_FileOpFailed, GetLastError());
}

void 
CFileImpWin32::Move(const char *oldPath, const char *newPath)
{
	pgpAssertStrValid(oldPath);
	pgpAssertStrValid(newPath);

	if (!MoveFile(oldPath, newPath))
		THROW_ERRORS(kPGPError_FileOpFailed, GetLastError());
}

void 
CFileImpWin32::Read(void *buf, PGPUInt64 pos, PGPUInt32 nBytes) const
{
	pgpAssert(IsOpened());
	pgpAssertAddrValid(buf, VoidAlign);

	EzSetFilePointer(pos);

	unsigned long numRead;

	if (!ReadFile(mFileHandle, buf, nBytes, &numRead, NULL))
		THROW_ERRORS(kPGPError_ReadFailed, GetLastError());
}

void 
CFileImpWin32::Write(const void *buf, PGPUInt64 pos, PGPUInt32 nBytes) //const
{
	pgpAssert(IsOpened());
	pgpAssertAddrValid(buf, VoidAlign);

	EzSetFilePointer(pos);

	unsigned long numWritten;

	if (!WriteFile(mFileHandle, buf, nBytes, &numWritten, NULL))
		THROW_ERRORS(kPGPError_WriteFailed, GetLastError());
}

void 
CFileImpWin32::EzSetFilePointer(PGPUInt64 bytes) const
{
	pgpAssert(IsOpened());

	LARGE_INTEGER	liBytes;
	liBytes.QuadPart = static_cast<PGPInt64>(bytes);

	liBytes.LowPart = SetFilePointer(mFileHandle, liBytes.LowPart, 
		&liBytes.HighPart, FILE_BEGIN);
	
	if ((liBytes.LowPart == 0xFFFFFFFF) && (GetLastError() != NO_ERROR))
		THROW_ERRORS(kPGPError_FileOpFailed, GetLastError());
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -