#1 Программирование » Чтения файлов из подпапок папки » 08-08-2010 11:57

Jeka_22
Replies: 0

Всем привет,вопрос такой, хотелось чтоб кто-то показал на этом коде, как сделать чтения файлов с подпапок?
Надеюсь на вашу помощь.


void DllInit()
{
#ifdef USE_LOG
	fopen_s(&pLogFile, "vimg.log", "w");
#endif

	{
		GetModuleFileName(NULL, cSelfPath, MAX_PATH);
		if (strrchr(cSelfPath, '\\')) *(char*)(strrchr(cSelfPath, '\\') + 1) = '\0';

		char cFilePath[MAX_PATH];
		strcpy_s(cFilePath, MAX_PATH, cSelfPath);
		strcat_s(cFilePath, MAX_PATH, "virtualimg.dat");

		FILE* pFile;
		if (fopen_s(&pFile, cFilePath, "r"))
		{
			MessageBox(0, "Failed to open virtualimg.dat.", "Virtual IMG", MB_OK | MB_ICONERROR);
			ExitProcess(0);
		}

		char cType[16];
		int iType;
		char cIMGPath[MAX_PATH];
		char cDirPath[MAX_PATH];

		while (fscanf_s(pFile, "%s\t%s\t%s", cType, 16, cIMGPath, MAX_PATH, cDirPath, MAX_PATH) == 3)
		{
			iType = 0;
			if (!_stricmp(cType, "MARGE")) iType = 1;
			if (!_stricmp(cType, "CREATE")) iType = 2;
			if (!_stricmp(cType, "APPEND")) iType = 3;
			if (!_stricmp(cType, "IGNORE")) continue;

			pVirtualIMG = (VirtualIMG*)realloc(pVirtualIMG, sizeof(VirtualIMG) * (iIMGCount + 1));

			pVirtualIMG[iIMGCount].iType = iType;
			strcpy_s(pVirtualIMG[iIMGCount].cIMGPath, MAX_PATH, cIMGPath);
			strcpy_s(pVirtualIMG[iIMGCount].cDirPath, MAX_PATH, cDirPath);
			pVirtualIMG[iIMGCount].hIMGFile = 0;
			pVirtualIMG[iIMGCount].hNewFile = 0;
			pVirtualIMG[iIMGCount].iIMGFile = 0;
			pVirtualIMG[iIMGCount].cIMGFile = NULL;

			if (!pVirtualIMG[iIMGCount].iType) continue;

			strcpy_s(cIMGPath, MAX_PATH, cSelfPath);
			strcat_s(cIMGPath, MAX_PATH, pVirtualIMG[iIMGCount].cIMGPath);
			strcpy_s(cFilePath, MAX_PATH, cIMGPath);
			strcat_s(cFilePath, MAX_PATH, ".vimg");

			pVirtualIMG[iIMGCount].hIMGFile = CreateFile(cIMGPath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_RANDOM_ACCESS, NULL);

			HANDLE hNewIMG;
			HANDLE hFind;
			WIN32_FIND_DATA ffd;
			unsigned long dwCurrentFile = 0x00800000;
			unsigned long dwVersion;
			unsigned long dwFileNum;
			unsigned long dwBuffer[8];
			unsigned long dwSize;
			unsigned long dwIMGFile;

			hNewIMG = CreateFile(cFilePath, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_FLAG_RANDOM_ACCESS, NULL);

			ReadFile(pVirtualIMG[iIMGCount].hIMGFile, &dwVersion, 0x4, &dwSize, NULL);
			WriteFile(hNewIMG, &dwVersion, 0x4, &dwSize, NULL);

			dwFileNum = 0;
			WriteFile(hNewIMG, &dwFileNum, 0x4, &dwSize, NULL);

			strcpy_s(cDirPath, MAX_PATH, cSelfPath);
			strcat_s(cDirPath, MAX_PATH, pVirtualIMG[iIMGCount].cDirPath);
			strcat_s(cDirPath, MAX_PATH, "*");

			pVirtualIMG[iIMGCount].iIMGFile = 0;

			hFind = FindFirstFile(cDirPath, &ffd);
			while (FindNextFile(hFind,&ffd))
			{
				if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
				{
					if (!FindNextFile(hFind, &ffd)) break;
					continue;
				}
				dwBuffer[0] = dwCurrentFile;
				dwBuffer[1] = (ffd.nFileSizeLow >> 11 | ffd.nFileSizeHigh << 21) + 1;
				//ZeroMemory(&dwBuffer[2], 0x18); 
				strcpy_s((char*)&dwBuffer[2], 0x18, strrchr(ffd.cFileName, '\\') ? strrchr(ffd.cFileName, '\\') + 1 : ffd.cFileName);
				WriteFile(hNewIMG, dwBuffer, 0x20, &dwSize, NULL);
				pVirtualIMG[iIMGCount].cIMGFile =(char*)realloc(pVirtualIMG[iIMGCount].cIMGFile, MAX_PATH * (pVirtualIMG[iIMGCount].iIMGFile + 1));
				strcpy_s(&pVirtualIMG[iIMGCount].cIMGFile[MAX_PATH * pVirtualIMG[iIMGCount].iIMGFile], MAX_PATH, cSelfPath);
				strcat_s(&pVirtualIMG[iIMGCount].cIMGFile[MAX_PATH * pVirtualIMG[iIMGCount].iIMGFile], MAX_PATH, pVirtualIMG[iIMGCount].cDirPath);
				strcat_s(&pVirtualIMG[iIMGCount].cIMGFile[MAX_PATH * pVirtualIMG[iIMGCount].iIMGFile], MAX_PATH, ffd.cFileName);
				pVirtualIMG[iIMGCount].iIMGFile++;
				dwFileNum++;
				dwCurrentFile++;
				//if (!FindNextFile(hFind, &ffd)) break;
			}
			FindClose(hFind);
			switch (pVirtualIMG[iIMGCount].iType)
			{
			case 1:
				{
					ReadFile(pVirtualIMG[iIMGCount].hIMGFile, &dwIMGFile, 0x4, &dwSize, NULL);
					for (unsigned long i = 0; i < dwIMGFile; i++)
					{
						ReadFile(pVirtualIMG[iIMGCount].hIMGFile, dwBuffer, 0x20, &dwSize, NULL);
						for (int j = 0; j < pVirtualIMG[iIMGCount].iIMGFile; j++) if (!_stricmp((const char*)&dwBuffer[2], (strrchr(&pVirtualIMG[iIMGCount].cIMGFile[MAX_PATH * j], '\\')) ? strrchr(&pVirtualIMG[iIMGCount].cIMGFile[MAX_PATH * j], '\\') + 1 : &pVirtualIMG[iIMGCount].cIMGFile[MAX_PATH * j]))
						{
							dwBuffer[1] = 0;
							break;
						}
						if (!dwBuffer[1]) continue;
						WriteFile(hNewIMG, dwBuffer, 0x20, &dwSize, NULL);
						dwFileNum++;
					}
					break;
				}
			case 2:
				{
					break;
				}
			case 3:
				{
					ReadFile(pVirtualIMG[iIMGCount].hIMGFile, &dwIMGFile, 0x4, &dwSize, NULL);
					for (unsigned long i = 0; i < dwIMGFile; i++)
					{
						ReadFile(pVirtualIMG[iIMGCount].hIMGFile, dwBuffer, 0x20, &dwSize, NULL);
						WriteFile(hNewIMG, dwBuffer, 0x20, &dwSize, NULL);
						dwFileNum++;
					}
					break;
				}
			}

			CloseHandle(pVirtualIMG[iIMGCount].hIMGFile);
			pVirtualIMG[iIMGCount].hIMGFile = CreateFile(cIMGPath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED | FILE_FLAG_RANDOM_ACCESS, NULL);

			SetFilePointer(hNewIMG, 0x4, NULL, FILE_BEGIN);
			WriteFile(hNewIMG, &dwFileNum, 0x4, &dwSize, NULL);
			CloseHandle(hNewIMG);

			iIMGCount++;
		}
	}

Board footer

Powered by FluxBB