#windows #visual-c
#Windows #visual-c
Вопрос:
Здесь глубоко в соусе. Я не очень много работал со временем, поэтому я здесь немного смущен. Я знаю, что есть FILETIME и SYSTEMTIME. На данный момент я пытаюсь получить (потому что это может измениться) файл, возраст которого составляет менее 20 секунд. Это возвращает файлы и их размер и что-то в секундах, я хотел бы знать, где он фильтрует по времени, если это так, и как я могу настроить его в соответствии с моими потребностями. Спасибо.
using namespace std;
typedef vector<WIN32_FIND_DATA> tFoundFilesVector;
std::wstring LastWriteTime;
int getFileList(wstring filespec, tFoundFilesVector amp;foundFiles)
{
WIN32_FIND_DATA findData;
HANDLE h;
int validResult=true;
int numFoundFiles = 0;
h = FindFirstFile(filespec.c_str(), amp;findData);
if (h == INVALID_HANDLE_VALUE)
return 0;
while (validResult)
{
numFoundFiles ;
foundFiles.push_back(findData);
validResult = FindNextFile(h, amp;findData);
}
return numFoundFiles;
}
void showFileAge(tFoundFilesVector amp;fileList)
{
unsigned _int64 fileTime, curTime, age;
tFoundFilesVector::iterator iter;
FILETIME ftNow;
//__int64 nFileSize;
//LARGE_INTEGER li;
//li.LowPart = ftNow.dwLowDateTime;
//li.HighPart = ftNow.dwHighDateTime;
CoFileTimeNow(amp;ftNow);
curTime = ((_int64) ftNow.dwHighDateTime << 32) ftNow.dwLowDateTime;
for (iter=fileList.begin(); iter<fileList.end(); iter )
{
fileTime = ((_int64)iter->ftLastWriteTime.dwHighDateTime << 32) iter->ftLastWriteTime.dwLowDateTime;
age = curTime - fileTime;
cout << "FILE: '" << iter->cFileName << "', AGE: " << (_int64)age/10000000UL << " seconds" << endl;
}
}
int main()
{
string fileSpec = "*.*";
tFoundFilesVector foundFiles;
tFoundFilesVector::iterator iter;
int foundCount = 0;
getFileList(L"c:\Mapper\*.txt", foundFiles);
getFileList(L"c:\Mapper\*.jpg", foundFiles);
foundCount = foundFiles.size();
if (foundCount)
{
cout << "Found "<<foundCount<<" matching files.n";
showFileAge(foundFiles);
}
system("pause");
return 0;
}
Комментарии:
1. Какие числа вы получаете для файла, который был создан (или последний раз изменен) в известное время? Затем вы можете связать их.
2. Файл 49 минут назад … возвращает 2965 секунд при запуске кода. Звучит неправильно??? Или это файловое время 2965, и я полностью отключен от базы?
3. ну, 2965/60 составляет примерно 49,5, так что да, это звучит правильно.
Ответ №1:
Я не знаю, что вы сделали, чтобы попытаться отладить это, но ваш код вообще не работает. Причина в том, что вы передаете getFileList() wstring, но затем передаете его в ANSI-версию FindFirstFile() . Если вы не #define UNICODE или не используете соответствующую опцию компилятора, все системные вызовы будут ожидать char *, а не UNICODE.
Самое простое решение — просто изменить объявление getFileList() на это:
int getFileList(const char * filespec, tFoundFilesVector amp;foundFiles)
Измените вызов FindFirstFile() на этот:
h = FindFirstFile((LPCSTR)filespec, amp;findData);
А затем измените вызовы на это:
getFileList("c:\Mapper\*.txt", foundFiles);
getFileList("c:\Mapper\*.jpg", foundFiles);
Другой вариант — переключить все строки символов на широкие символы, но в любом случае вам нужно быть последовательным во всем. Как только вы это сделаете, программа будет работать должным образом.
Что касается вашего последнего вопроса, ваша программа вообще не фильтрует по времени.
Комментарии:
1. хммм, теперь я в полном замешательстве…. когда я запускаю предварительные предложения кода. Я понимаю это. Найдено 1 совпадающих файлов. ФАЙЛ: ‘006547BC’, ВОЗРАСТ: 53739 секунд Нажмите любую клавишу, чтобы продолжить … и когда я что-то меняю. Я получаю нажатие любой клавиши.
2. Я понятия не имею, почему он нашел какой-либо файл, но вы передаете функции FindFirstFile неверные данные. Какие файлы находятся в c:Mapper папка с расширениями *.txt или * .jpg?
3. Тогда это ваша проблема. Вам нужно решить, используете ли вы ANSI или UNICODE, и быть последовательным во всем. Внесите предложенные мной изменения, удалите ЮНИКОД, и он будет работать.
4. Хорошо, будучи новичком в этом. Что бы вы сказали, лучше. ЮНИКОД или ANSI. Я выбираю размер и время. Тем временем я переключусь на Ansi и попробую ваши предложения. Спасибо. ПО сравнению с 2010 годом. У меня есть выбор между многобайтовым и не установленным. Какой из них?
5. НА ВЫХОДЕ найдено 2 совпадающих файла. ФАЙЛ: ‘2.txt ‘, ВОЗРАСТ: 54816 секунд ФАЙЛ: ‘ONEWAY.txt ‘, ВОЗРАСТ: 362 секунды Нажмите любую клавишу, чтобы продолжить … Не установлено
Ответ №2:
Не совсем ответ, но вы можете прочитать о туннелировании файловой системы.
В некоторых ситуациях это может помешать вам сделать то, что вы пытаетесь сделать.
Комментарии:
1. Вау! Это очень полезно знать! Я ценю вклад!