-2
아래 함수를 사용하여 재귀 적으로 디렉토리를 추출하려고합니다. 프로그램을 실행하면 루트 디렉토리와 그 안에있는 파일을 만들 수 있지만 하위 디렉토리 안에 파일을 완전히 쓸 수는 없습니다.디렉토리를 재귀 적으로 추출하는 방법은 무엇입니까?
내 코드를 컴파일 할 수는 있지만 세그먼트 오류 오류가 계속 발생합니다. 내 함수 나 메모리에서 다른 포인터로 접근해서는 안되지만 아무렇지도 않게되는 악의적 인 포인터를 찾으려고 노력했다. 올바른 방향으로 도움이나 안내를 해주시면 매우 감사하겠습니다! 여기
내 추출 기능입니다 : 눈에서int DExtract(FILE* fp, char* outputName, char* inputName, DIR* d, bool root)
{
DIR* dsub;
struct dirent* p;
FILE* outF;
int i=0;
char fileName[BUFFER_SIZE];
char SfileName[BUFFER_SIZE];
bool SC;
int dz;
int nameLength;
int fileSize;
int fileType;
////// ROOT CREATION /////////////
if(root)
{
fscanf(fp,"%d %d %s %d\n", &fileType, &nameLength, inputName, &fileSize);
if(fileType==0)
{
mkdir(outputName, 0755); // create root directory
}
}
//////////////////////////////////
root = false; // MOVING INTO ROOT
d = opendir(outputName); // open directory with input name
while((p = readdir(d)) || (dz != EOF))
{ fscanf(fp,"%d %d %s %s %d ",&fileType, &nameLength, p->d_name, fileName, &fileSize);
//////////////////////////////////////////////////
strcpy(SfileName,outputName);
for(int h=0; h < strlen(fileName); h++)
{
if(fileName[h] == '/')
{ SC = true;}
if(SC == true)
{ strcat(SfileName, &fileName[h]);
h=strlen(fileName);
}
}
SC = false;
cout << "STRING LENGTH FILENAME: " << strlen(fileName) << endl;
cout << "SFILENAME in WHILE: " << SfileName << endl;
///////////////////////////////////// /////////////////
if(strcmp(p->d_name, ".") != 0) // if they are not the same as current working directory
{ if(strcmp(p->d_name, "..") != 0) // if they are not the same as parent directory
{ if(p->d_name[nameLength - 1] != '~') // If not the same as home directory
{
///////////////////////////
if(fileType == 1)
{
// This is a regular file
outF = fopen(SfileName, "w+"); // create file
i=0;
do
{
int ch;
ch = fgetc(fp);
dz = ch;
if(i != (fileSize-1))
{
fputc(ch,outF);
i++;
}
}while(i != (fileSize-1));
fclose(outF);
}
else if(fileType == 0)
{
// This is a directory
cout << "SFILENAME in DIRECTORY: " << SfileName << endl;
mkdir(SfileName, 0755); // create directory
if((strcmp(SfileName, ".") != 0))
{
dsub = opendir(SfileName);
DExtract(fp, outputName, inputName, dsub, root);
}
}
}
}
}
}
return 0;
}
'fscanf()'를 사용하여'readdir()'로 방금 읽은'p-> d_name'을 덮어 쓰는 이유는 무엇입니까? – Barmar
'if (p-> d_name [nameLength - 1]! = '~')'이것은 작동하지 않습니다. 홈 디렉토리는 실제로'~'로 이름 지어지지 않으며 쉘과 다른 프로그램에서 사용되는 규칙 일뿐입니다. 그들은'$ HOME' 환경 변수의 값으로 대체합니다. – Barmar
"디렉토리 추출"의 의미는 무엇입니까? 재귀 적으로 파일을 나열하거나 파일을 재귀 적으로 작성하는 데 문제가 있습니까? –