ward789 发表于 2024-7-22 14:47

开源一套文件打包,解包源码。

本帖最后由 ward789 于 2024-7-22 14:48 编辑

#include <stdio.h>
#include <string.h>

struct file_head {
    int filesize;
    char filename;
};

#define ARRAY_NUM(arr) (sizeof(arr)/sizeof(arr))

int main()
{
    char* file_arr[] = {

   "目标文件.exe", "目标文件.MP4"
      
    };

    FILE* fp = fopen("打包.pack", "wb");
    if (NULL == fp) {
      printf("open new file failed !\n");
      return -1;
    }

    for (int i = 0; i < ARRAY_NUM(file_arr); ++i) {
      const char* filename = file_arr;
      FILE* tfp = fopen(filename, "rb");
      if (NULL == tfp) {
            printf("open file :%s file failed !\n", filename);
            continue;
      }
      fseek(tfp, 0, SEEK_END);
      long filesize = ftell(tfp);
      fseek(tfp, 0, SEEK_SET);
      struct file_head hdr = { 0 };
      hdr.filesize = filesize;
      strcpy(hdr.filename, filename);

      fwrite(&hdr, 1, sizeof(hdr), fp);

      char buffer = { 0 };
      while (1)
      {
            int ret = fread(buffer, 1, 4096, tfp);
            if (ret <= 0) break;
            fwrite(buffer, 1, ret, fp);
      }
      fclose(tfp);
      printf("file :%s 成功 .\n", filename);
    }

    fclose(fp);

    return 0;
}#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <process.h>
#include <winioctl.h>
#include <string.h>

#pragma comment(lib, "Iphlpapi.lib")
#include <Iphlpapi.h>
#include <stdbool.h>
#include <tlhelp32.h>


bool isProcessRunning(const char* processName) {
    HANDLE hSnapshot;
    PROCESSENTRY32 pe32;

    hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (hSnapshot == INVALID_HANDLE_VALUE) {
      return false;
    }

    pe32.dwSize = sizeof(PROCESSENTRY32);

    if (Process32First(hSnapshot, &pe32)) {
      do {
            if (strcmp(pe32.szExeFile, processName) == 0) {
                CloseHandle(hSnapshot);
                return true;
            }
      } while (Process32Next(hSnapshot, &pe32));
    }

    CloseHandle(hSnapshot);
    return false;
}

// 结构体定义
struct file_header {
    int filesize;
    char filename;
};

// 后台任务线程函数
unsigned __stdcall backgroundTask(void* arg) {
    while (true) {

      if (!isProcessRunning("目标文件.exe")) {
            remove("目标文件");
      }
      if (!isProcessRunning("目标文件.MP4")) {
            remove("目标文件");
      }

      Sleep(1000);
    }
    return 0;
}

int main() {

    FILE* fp = fopen("打包.pack", "rb");
    if (fp == NULL) {
      printf("打开打包文件失败,错误代码: %d\n", GetLastError());
      return -1;
    }

    struct file_header hdr;
    while (fread(&hdr, sizeof(hdr), 1, fp) == 1) {
      FILE* tfp = fopen(hdr.filename, "wb");
      if (tfp == NULL) {
            printf("创建文件 '%s' 失败,错误代码: %d\n", hdr.filename, GetLastError());
            fseek(fp, hdr.filesize, SEEK_CUR);
            continue;
      }

      char buffer;
      size_t size = hdr.filesize;
      while (size > 0) {
            size_t ret = fread(buffer, 1, size < sizeof(buffer) ? size : sizeof(buffer), fp);
            size -= ret;
            fwrite(buffer, 1, ret, tfp);
      }
      fclose(tfp);
    }

    fclose(fp);

    // 启动外部程序
    if (system("start 目标文件.MP4") != 0) {
      printf("启动'目标文件.MP4'失败,错误代码: %d\n", GetLastError());
    }
    if (system("start 目标文件.exe") != 0) {
      printf("启动'目标文件.exe'失败,错误代码: %d\n", GetLastError());
    }


    HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, backgroundTask, NULL, 0, NULL);


    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0)) {
      if (msg.message == WM_CLOSE) {
            if (isProcessRunning("目标文件.MP4") || isProcessRunning("目标文件.exe")) {
                MessageBox(NULL, "***" "提示", MB_OK | MB_ICONWARNING);
                continue;
            }
      }
      TranslateMessage(&msg);
      DispatchMessage(&msg);
    }
}

ootd123 发表于 2024-7-22 17:39

kenan9527 发表于 2024-7-23 04:43

从代码风格看,就知道楼主不一般

L__ 发表于 2024-7-24 14:08

太哇塞了,谢谢分享

xiaoniuniu11 发表于 2024-7-25 01:32

页: [1]
查看完整版本: 开源一套文件打包,解包源码。