如何跳过tar文件中的一个文件以获得特定的文件
how to skip a file inside the tar file to get a particular file
我正在字符串中获取tar文件中的html文件的内容(我正在使用visual c++来完成我的任务)。我的方法是使用流将tar存储在缓冲区中,然后将html的内容存储在另一个缓冲区中。然后使用buffer到位置buffer[0-100]的tar文件中每个文件的文件名(在这个位置我们有文件名),并将文件名存储在"contents"中(在我的情况下),然后搜索它是否具有扩展名.html文件??
如果它的文件名中有.html,那么将其内容存储在位置缓冲区[PreviousFileSizes+512]中(PreviousFileSizes我的意思是在这个html文件之前有一些文件,所以我们必须在缓冲区索引中添加它们的大小才能到达正确的位置-我的意思不是假设tar文件中的第一个文件是html文件。在我的代码中,我用"skip"表示这个PreviousFileSize-这意味着要跳过这么大的大小才能转到我们的html文件)。
我实现它的代码是-
int skip=0;
char contents [100];
//char test[1000];
do
{
int SizeOfFile = CreateOctalToInteger(&buffer[skip+124],11);
size_t distance= ((SizeOfFile%512) ? SizeOfFile + 512 - (SizeOfFile%512) : SizeOfFile );
size_t skip= distance +512;
memcpy(contents,&buffer[skip],100);
}
while(strstr(contents,".html") != NULL);
我走得对吗??如果我的逻辑有什么错误,请纠正我??
除了错误之外,看起来还不错:-)
- 您设置了
skip = ...
而不是skip += ..
,因此您在buffer
中的位置仅适用于第二个文件 - 您不检查第一个文件(因为它是
do { ... } while()
,并且第一次调用strstr()
时,contents
已经在某个位置skip
>0填充了buffer
) - 当您找到"文件名"
""
时,您还应该添加一个"中断"条件来停止循环
编辑当然,我们还应该检查tar文件的大小。
我会这样尝试:
// I assume size_t bufsize to be the tar file size
size_t skip = 0;
while( bufsize > skip && strcmp( buffer+skip, "" ) != 0 && strstr( buffer+skip, ".html" ) != 0 ) {
int SizeOfFile = CreateOctalToInteger(&buffer[skip+124],11);
size_t distance= ((SizeOfFile%512) ? SizeOfFile + 512 - (SizeOfFile%512) : SizeOfFile );
skip += distance +512;
}
if( bufsize > skip && strstr( buffer+skip, ".html" ) == 0 ) {
// hooray
int SizeOfHTML = CreateOctalToInteger(&buffer[skip+124],11);
char *htmlData = buffer+skip+512;
// do stuff with htmlData
}
最后,我为这个问题找到了解决方案,代码必须如下所示-
char* StartPosition;
size_t skip= 0;
char HtmlFileContents [200000];
char contents [8000];
do
{
int SizeOfFile = CreateOctalToInteger(&buffer[skip+124],11);
size_t distance= ((SizeOfFile%512) ? SizeOfFile + 512 - (SizeOfFile%512) : SizeOfFile );
skip += distance + 512;
memcpy(contents,&buffer[skip],100);
if (StartPosition=strstr(contents,".html"))
{
MessageBox(m_hwndPreview,L"finally string is copied",L"BTN WND6",MB_ICONINFORMATION);
int SizeOfFile = CreateOctalToInteger(&buffer[skip+124],11);
memcpy(HtmlFileContents,&buffer[skip+512],SizeOfFile);
break;
}
}
while(strcmp(contents,".html") != NULL);
我想这是自我解释。如果没有??请毫不犹豫地问我。
相关文章:
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 挂起和取消挂起一个文件DLL
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- C++试图读取一个文件并输出到另一个文本文件
- 如何从另一个文件继承私有成员变量和公共函数
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- 如何打开并写入一个名称取自C++中字符串的文件
- 构建一个由C和C++文件组成的库
- c++多进程编写一个唯一的文件
- 如何使用CLion在Mac上创建一个新的.txt文件
- 如何将class.cpp和class.hpp编译为一个.o文件
- 写入文件会产生一个空文件或根本没有文件
- 如何将不同的可执行文件合并到一个窗口框架中进行编码?像浏览器一样
- 生成一个生成文件,该生成文件使用Automake在一个步骤中编译和链接所有源文件
- 为什么我的 heap.h 文件给我一个LNK2001错误?
- Pantheios 不使用 MFC 应用程序写入一个文件(一个 exe + 两个 DLL)
- 在C++中一次读取一个文件一个int
- 输入/输出文件(一个字母的大写)
- 如何使用两个预编译的头文件.一个用于托管代码,另一个用于非托管代码.xxx.PCH不是一个有效的预编译头文件