如何跳过tar文件中的文件以获取特定文件 我想获取一个HTML文件的内容,它存在于TAR文件中(我使用VisualC++完成我的任务)。我的方法是使用一个流将tar存储在一个缓冲区中,然后将html的内容存储在另一个缓冲区中。然后使用缓冲区将tar文件中存在的每个文件的文件名定位到buffer[0-100](在这个位置我们有文件名)并将文件名存储在“contents”(在我的例子中)中并搜索它是否有扩展名.html文件
如果文件名中有.html,则从位置缓冲区[PreviousFileSizes+512]存储其内容(我所说的PreviousFileSizes是指在这个html文件之前有一些文件,所以我们必须在缓冲区索引中添加它们的大小以转到正确的位置-我的意思是,我没有假设tar文件中的第一个文件是html文件。在我的代码中,我用“跳过”来表示这个PreviousFileSizes-这意味着要跳过这么大的大小才能转到我们的html文件) 我实现它的代码是-如何跳过tar文件中的文件以获取特定文件 我想获取一个HTML文件的内容,它存在于TAR文件中(我使用VisualC++完成我的任务)。我的方法是使用一个流将tar存储在一个缓冲区中,然后将html的内容存储在另一个缓冲区中。然后使用缓冲区将tar文件中存在的每个文件的文件名定位到buffer[0-100](在这个位置我们有文件名)并将文件名存储在“contents”(在我的例子中)中并搜索它是否有扩展名.html文件,c++,html-parsing,tar,C++,Html Parsing,Tar,如果文件名中有.html,则从位置缓冲区[PreviousFileSizes+512]存储其内容(我所说的PreviousFileSizes是指在这个html文件之前有一些文件,所以我们必须在缓冲区索引中添加它们的大小以转到正确的位置-我的意思是,我没有假设tar文件中的第一个文件是html文件。在我的代码中,我用“跳过”来表示这个PreviousFileSizes-这意味着要跳过这么大的大小才能转到我们的html文件) 我实现它的代码是- int skip=0; cha
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+=…
,因此您在缓冲区中的位置仅对第二个文件正确
do{…}while()
,并且您第一次调用strstr()
,内容
已经在某个位置填充了缓冲区
李>
// 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);
我猜这是自我解释。如果没有呢??请尽管问我。您是否尝试过使用
tar xf mytarfile myfile.html
?这不是很容易吗?是你正在谈论的任何命令吗?如果是,我不必处理命令提示符。只是C++代码,用于获取在TAR文件中存在的HTML文件的内容。如果有什么新的简单的东西,请适当地解释一下“tar xf mytarfile myfile.html”是什么?我指的是命令提示符工具-如果你选择了这个选项,你上周就已经完成了。只要接受它是一个命令提示工具这一事实就行了。或者找一个能在GUI中运行的tar
工具,我肯定会有这样的东西。对不起,Mats..我不知道如何做ar所说的。请给我一些链接到undersatnd well。但是在前面的代码中,我得到了下一个文件的大小(我的意思是我只能滑动第一个文件,而不是第二个文件。我认为在do while循环µ中存在一些问题。你能预测出这个问题是什么吗?(我的意思是,在我找不到.html文件之前,这个跳过不会重复循环。它只执行一次,调试时我可以看到tar文件中第二个文件的文件内容,但之后会出现)不,我不知道任何链接-我肯定它们存在,但我相信你可以像我一样使用谷歌。有一些疑问。你为什么使用这个条件(1)strcmp(buffer+skip,“why you have keep BLANK”)!=0(2。)通过这个buffer+skip。你的意思是什么您要求我中断条件的位置。我是否需要在您编写的代码中设置中断条件??将文件名与“
进行比较是因为我的回答中的第3点。这只是额外的中断条件。buffer+skip
相当于&buffer[skip]
。你更喜欢什么取决于你,猜猜我更喜欢什么:-)。无论如何,这与您在原始代码中所做的操作相同—将文件名与positionskip
进行比较—只是没有将一部分复制到contents
中,这是不必要的,但在程序中我不知道文件名。因为我的程序适用于每个包含.html文件的tar文件。实际上,我需要撕开.html内容并需要使用缓冲区显示。因此,我不知道tar文件中的文件名是什么。在这种情况下,我可以手动查看文件名,但无法查看包含html文件的每个tar文件。我的程序应该适用于tar文件中存在的每个html文件。你明白我所说的吗要说什么?我的代码中使用了什么文件名,除了最后一个文件后面的文件名之外?请看。请尝试一下