夜月琉璃Lv46
window平台上copy /b 两个文件 本质上是如何实现的?
原文转载自:https://www.zhihu.com/question/27971703 作者:pezy
根据 Appending Binary Files Using the COPY Command 可粗略的认为,就是以二进制的方式合并两个文件到一个新文件中。
echo Hello > 1.txt
echo World > 2.txt
copy /b 1.txt+2.txt 3.txt
那么此刻 3.txt 中应该是Hello
World
如果仅仅实现上述例子中的基本功能,使用几个系统的 API 就可以搞定。代码如下:
#include <windows.h>
#include <stdio.h>
void main()
{
HANDLE hFile;
HANDLE hAppend;
DWORD dwBytesRead, dwBytesWritten, dwPos;
BYTE buff[4096];
// Copy the existing file.
BOOL bCopy = CopyFile(TEXT("1.txt"), TEXT("3.txt"), TRUE);
if (!bCopy)
{
printf("Could not copy 1.txt to 3.txt.");
return;
}
// Open the existing file.
hFile = CreateFile(TEXT("2.txt"), // open 2.txt
GENERIC_READ, // open for reading
0, // do not share
NULL, // no security
OPEN_EXISTING, // existing file only
FILE_ATTRIBUTE_NORMAL, // normal file
NULL); // no attr. template
if (hFile == INVALID_HANDLE_VALUE)
{
printf("Could not open 2.txt.");
return;
}
// Open the existing file, or if the file does not exist,
// create a new file.
hAppend = CreateFile(TEXT("3.txt"), // open 3.txt
FILE_APPEND_DATA, // open for writing
FILE_SHARE_READ, // allow multiple readers
NULL, // no security
OPEN_ALWAYS, // open or create
FILE_ATTRIBUTE_NORMAL, // normal file
NULL); // no attr. template
if (hAppend == INVALID_HANDLE_VALUE)
{
printf("Could not open 3.txt.");
return;
}
// Append the first file to the end of the second file.
// Lock the second file to prevent another process from
// accessing it while writing to it. Unlock the
// file when writing is complete.
while (ReadFile(hFile, buff, sizeof(buff), &dwBytesRead, NULL)
&& dwBytesRead > 0)
{
dwPos = SetFilePointer(hAppend, 0, NULL, FILE_END);
LockFile(hAppend, dwPos, 0, dwBytesRead, 0);
WriteFile(hAppend, buff, dwBytesRead, &dwBytesWritten, NULL);
UnlockFile(hAppend, dwPos, 0, dwBytesRead, 0);
}
// Close both files.
CloseHandle(hFile);
CloseHandle(hAppend);
}
将代码中的 1.txt, 2.txt, 3.txt 改为任何别的文件,是一样的。如题主补充的要求,做如下替换即可:
1.txt -> a.jpg
2.txt -> b.txt
3.txt -> c.txt (文本),c.jpg(更改后缀,成为图片)
诸如 jpg 之类的格式,依然是二进制文件,经过渲染,表现为图片而已。
5 已被阅读了5890次 楼主 2017-08-23 14:08:22