taurusxin / ncmdump

转换网易云音乐 ncm 到 mp3 / flac. Convert Netease Cloud Music ncm files to mp3/flac files.
MIT License
1.04k stars 168 forks source link

保留文件时间戳 #1

Closed Summer20130725 closed 1 year ago

Summer20130725 commented 1 year ago

作者大大你好,我用了你这个命令行版本的网易音乐解码器我觉得不错,我想给个建议就是能否保留原始文件时间戳?转码之后文件时间变了!

taurusxin commented 1 year ago

没问题,这几天有时间看看

Summer20130725 commented 1 year ago

没问题,这几天有时间看看

作者大大,不用看了我想了一个晚上想出来了。这里只考虑了windows平台,Linux的话作者大大你也可以看一看,有时间把windows平台支持的方案加上去,代码如下: 1 6

/* ncmcrypt.h */

#ifdef UNICODE
#undef UNICODE
#endif
#include <windows.h>

/* only read */
#define O_R 0x000000

/* only write */
#define O_W 0x000001

BOOL WINAPI archivesTime(LPCTSTR filename, bool blMode);
BOOL WINAPI getFileTimeEx(HANDLE hFile, FILETIME ft[3]);
BOOL WINAPI setFileTimeEx(HANDLE hFile, FILETIME ft[3]);

2 3

/* ncmcrypt.cpp */

/* Creation, LastWrite, LastAccess */
FILETIME AllFileTime[3] = {0};

BOOL WINAPI NeteaseCrypt::getFileTimeEx(HANDLE hFile, FILETIME ft[3])
{
    DWORD dwRet = FALSE;
    dwRet = GetFileTime(hFile, ft, ft + 2, ft + 1);
    return dwRet;
}
BOOL WINAPI NeteaseCrypt::setFileTimeEx(HANDLE hFile, FILETIME ft[3])
{
    DWORD dwRet = FALSE;
    dwRet = SetFileTime(hFile, ft, ft + 2, ft + 1);
    return dwRet;
}
BOOL WINAPI NeteaseCrypt::archivesTime(LPCTSTR filename, bool blMode)
{
    HANDLE hFile = nullptr;
    DWORD dwRet = FALSE;

    hFile = CreateFile(
        filename,
        blMode == O_W ? FILE_WRITE_ATTRIBUTES : FILE_READ_ATTRIBUTES,
        FILE_SHARE_READ | FILE_SHARE_WRITE,
        NULL,
        OPEN_EXISTING,
        FILE_ATTRIBUTE_NORMAL,
        NULL);

    if (hFile == INVALID_HANDLE_VALUE)
    {
        std::cout << __FUNCTION__ << "() File Handle is Invalid!!!" << std::endl;
        return -1;
    }

    switch (blMode)
    {
    case O_R:
        dwRet = getFileTimeEx(hFile, AllFileTime);
        break;
    case O_W:
        dwRet = setFileTimeEx(hFile, AllFileTime);
        break;
    }

    CloseHandle(hFile);
    return dwRet;
}

调用位置:

  1. 读取文件时间 4
  2. 写入文件时间 5

效果: 加密文件时间戳 解密文件时间戳

taurusxin commented 1 year ago

感谢提供代码,有时间进去