Изменение временных атрибутов файла

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by cupper, 26 Feb 2011.

  1. cupper

    cupper Elder - Старейшина

    Joined:
    6 Jun 2007
    Messages:
    369
    Likes Received:
    92
    Reputations:
    5
    Изменяет время создание / редактирования/ открытия всех файлов (и папок тоже) в текущей директории (рекурсивно проходит по всем папкам текущей деректории делая тоже само для них)

    Исключительно под Win. Время устанавливается в текущее. При желании можете изменить на любое (ищи комент в коде)

    Code:
    #include <iostream>
    #include <Windows.h>
    #include <io.h>
    #include <fcntl.h>
    #include <string>
    
    #include <tchar.h>
    #include <stdio.h>
    
    #include <atlcomtime.h> // class COleDateTime
    
    
    using namespace std;
    
    #define MAX_PATH_LINGTH 512
    
    void ScanFile(const LPCWSTR path, const LPCWSTR mask);
    bool IsNoSistemDir(const LPCWSTR filename);
    void ModificTimeAttribute(const LPCWSTR path,  WIN32_FIND_DATA& handle);
    void ShowTimeAttrFile(const FILETIME&, const char* preText);
    
    int main(int argc, char* argv[])
    {
    	
    	ScanFile(L".", L"*");
    
    	char stop;
    	cin >> stop;
    }
    
    void ScanFile(const LPCWSTR path, const LPCWSTR mask)
    {
    	WIN32_FIND_DATA FindFileData;
    	HANDLE hFind;
    
        WCHAR buf[MAX_PATH_LINGTH];
    	wsprintf(buf, L"%s\\%s", path, mask);
    
    	hFind = FindFirstFile(buf, &FindFileData);
    	if (hFind != INVALID_HANDLE_VALUE) 
    	{
    		do
    		{
    			if(IsNoSistemDir(FindFileData.cFileName))
    			{
    				if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
    				{
    					wsprintf(buf, L"%s\\%s", path, FindFileData.cFileName);
    					ScanFile(buf, L"*");
    					ModificTimeAttribute(path, FindFileData);
    				}
    				else
    				{
    					ModificTimeAttribute(path, FindFileData);
    				}
    			}
    		}while(FindNextFile(hFind, &FindFileData));
    		FindClose(hFind);
    	}
    }
    void ModificTimeAttribute(const LPCWSTR path,  WIN32_FIND_DATA& handle)
    {
    	//    
    	/*ShowTimeAttrFile(handle.ftCreationTime, "\t[Old] time create:\t");
    	ShowTimeAttrFile(handle.ftLastAccessTime, "\t[Old] time access:\t");
    	ShowTimeAttrFile(handle.ftLastWriteTime,  "\t[Old] time write :\t");*/
    
    	WCHAR pathToFile[MAX_PATH_LINGTH];
    	wsprintf(pathToFile, L"%s\\%s", path, handle.cFileName);
    	HANDLE hfile;
    	wcout << pathToFile << endl;
    	if (handle.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
    	{
    		hfile = CreateFile(pathToFile, GENERIC_READ | GENERIC_WRITE, 0 , NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
    	}
    	else
    	{
    		hfile = CreateFile(pathToFile,
    							GENERIC_READ | GENERIC_WRITE,
    							FILE_SHARE_WRITE | FILE_SHARE_READ,
    							NULL,
    							OPEN_EXISTING,
    							FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
    							0);
    	}
    
    	FILETIME ft;
    	SYSTEMTIME st;
                  // Установите свое время !!!!!
    	COleDateTime dt = COleDateTime::GetCurrentTime();
    	dt.GetAsSystemTime(st);
    	SystemTimeToFileTime(&st, &ft);
    	if (!SetFileTime(hfile, &ft, &ft, &ft))
    
    	CloseHandle(hfile);
    }
    
    bool IsNoSistemDir(const LPCWSTR filename)
    {
    	if (wcscmp(filename, L".") == 0) return false;
    	if (wcscmp(filename, L"..") == 0) return false;
    
    	return true;
    }
    
    void ShowTimeAttrFile(const FILETIME& ft, const char* preText)
    {
    	SYSTEMTIME timeUTC, timeLocal;
    	FileTimeToSystemTime(&ft, &timeUTC);
        SystemTimeToTzSpecificLocalTime(NULL, &timeUTC, &timeLocal);
    
    	cout << preText
    		<< timeLocal.wYear << "/"
    		<< timeLocal.wMonth << "/"
    		<< timeLocal.wDay	<< "  "
    		<< timeLocal.wHour	<< ":"
    		<< timeLocal.wMinute<< ":"
    		<< timeLocal.wSecond<< endl;
    }
    
     
    1 person likes this.