文件粉碎

toadzw 2010-06-30 02:45:06
打开一个文件,写入新的数据,再保存回磁盘,能不能保证新文件与老文件是在同一个位置;
或者说文件粉碎时能不能直接有对磁盘进行操作的函数;
...全文
106 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
webcq1999 2010-06-30
  • 打赏
  • 举报
回复
如果数据长短与原来的相同的话,磁盘应该不会重新分配扇区吧,所以应该是写到原来的扇区中覆盖原有数据。
TonyWJ 2010-06-30
  • 打赏
  • 举报
回复
///////////////////////////////////////////////////////////////////
//Function : GetFileClusters() 获取文件簇分布
//Input : lpFileName 文件名称
//OutPut : ClusterSize 簇大小
// : ClCount 文件所占簇数
// : FileSize 文件实际占用大小(Byte)
//////////////////////////////////////////////////////////////////
ULONGLONG *GetFileClusters(
PCHAR lpFileName,
ULONG ClusterSize,
ULONG *ClCount,
ULONG *FileSize
)
{
HANDLE hFile;
ULONG OutSize;
ULONG Bytes, Cls, r;
LONGLONG CnCount;
ULONGLONG *Clusters = NULL;
BOOLEAN Result = FALSE;
LARGE_INTEGER PrevVCN, Lcn;
STARTING_VCN_INPUT_BUFFER InBuf;
PRETRIEVAL_POINTERS_BUFFER OutBuf;

hFile = CreateFile(lpFileName, FILE_READ_ATTRIBUTES,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
NULL, OPEN_EXISTING, 0, 0);
if (hFile != INVALID_HANDLE_VALUE)
{
*FileSize = GetFileSize(hFile, NULL);

OutSize = sizeof(RETRIEVAL_POINTERS_BUFFER) + (*FileSize / ClusterSize) * sizeof(OutBuf->Extents);

OutBuf = (PRETRIEVAL_POINTERS_BUFFER)malloc(OutSize);

InBuf.StartingVcn.QuadPart = 0;

if (DeviceIoControl(hFile, FSCTL_GET_RETRIEVAL_POINTERS, &InBuf,
sizeof(InBuf), OutBuf, OutSize, &Bytes, NULL))
{
*ClCount = (*FileSize + ClusterSize - 1) / ClusterSize;

Clusters = (PULONGLONG)malloc(*ClCount * sizeof(ULONGLONG));

PrevVCN = OutBuf->StartingVcn;

for (r = 0, Cls = 0; r < OutBuf->ExtentCount; r++)
{
Lcn = OutBuf->Extents[r].Lcn;

for (CnCount = OutBuf->Extents[r].NextVcn.QuadPart - PrevVCN.QuadPart;
CnCount; CnCount--, Cls++, Lcn.QuadPart++) Clusters[Cls] = Lcn.QuadPart;

PrevVCN = OutBuf->Extents[r].NextVcn;
}
}

free(OutBuf);

CloseHandle(hFile);
}

return Clusters;
}
踏实每一步 2010-06-30
  • 打赏
  • 举报
回复
同一个位置是指磁盘上某扇区的同一位置?这不可能。
toadzw 2010-06-30
  • 打赏
  • 举报
回复
能不能详细点哦,谢谢
TonyWJ 2010-06-30
  • 打赏
  • 举报
回复
不能保证在同一个位置,而且几乎肯定不在一个位置。

你必须获取文件在硬盘中的真实扇区,在对这些扇区进行操作才行。

获取文件所在簇的方法是通过CreateFile打开文件,通过DeviceIoControl的FSCTL_GET_RETRIEVAL_POINTERS 功能获取文件所在的簇
雪影 2010-06-30
  • 打赏
  • 举报
回复
1.不能保证
2.Sysinternals SDelete文件粉碎源代码
http://www.vcfans.com/2005/10/sysinternals-sdelete-source.html

16,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧