diff --git a/mz_os_win32.c b/mz_os_win32.c index b12d980f..8ede40f3 100644 --- a/mz_os_win32.c +++ b/mz_os_win32.c @@ -234,8 +234,7 @@ static void mz_os_unix_to_file_time(time_t unix_time, FILETIME *file_time) { } int32_t mz_os_get_file_date(const char *path, time_t *modified_date, time_t *accessed_date, time_t *creation_date) { - WIN32_FIND_DATAW ff32; - HANDLE handle = NULL; + WIN32_FILE_ATTRIBUTE_DATA wfad; wchar_t *path_wide = NULL; int32_t err = MZ_INTERNAL_ERROR; @@ -245,21 +244,19 @@ int32_t mz_os_get_file_date(const char *path, time_t *modified_date, time_t *acc if (!path_wide) return MZ_PARAM_ERROR; - handle = FindFirstFileW(path_wide, &ff32); - free(path_wide); - - if (handle != INVALID_HANDLE_VALUE) { + if (GetFileAttributesExW(path_wide, GetFileExInfoStandard, &wfad)) { if (modified_date) - mz_os_file_to_unix_time(ff32.ftLastWriteTime, modified_date); + mz_os_file_to_unix_time(wfad.ftLastWriteTime, modified_date); if (accessed_date) - mz_os_file_to_unix_time(ff32.ftLastAccessTime, accessed_date); + mz_os_file_to_unix_time(wfad.ftLastAccessTime, accessed_date); if (creation_date) - mz_os_file_to_unix_time(ff32.ftCreationTime, creation_date); + mz_os_file_to_unix_time(wfad.ftCreationTime, creation_date); - FindClose(handle); err = MZ_OK; } + free(path_wide); + return err; } diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 0e244d45..9a477a98 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -58,6 +58,10 @@ if(NOT MZ_COMPRESS_ONLY AND NOT MZ_DECOMPRESS_ONLY) list(APPEND TEST_SRCS test_stream_compress.cc) endif() +if(MSVC) + list(APPEND TEST_SRCS test_file.cc) +endif() + add_executable(gtest_minizip test_main.cc ${TEST_SRCS}) target_compile_definitions(gtest_minizip PRIVATE ${STDLIB_DEF} ${MINIZIP_DEF}) target_include_directories(gtest_minizip PRIVATE diff --git a/test/test_file.cc b/test/test_file.cc new file mode 100644 index 00000000..6b179657 --- /dev/null +++ b/test/test_file.cc @@ -0,0 +1,44 @@ +/* test_file.cc - Test file functionality + part of the minizip-ng project + + Copyright (C) Nathan Moinvaziri + https://github.com/zlib-ng/minizip-ng + + This program is distributed under the terms of the same license as zlib. + See the accompanying LICENSE file for the full text of the license. +*/ + +#include "mz.h" +#include "mz_os.h" + +#include +#include +#include + +TEST(os, get_file_date_ads) { + const std::string main_stream_name = "minizip_ads_test"; + const std::string ads_name = main_stream_name + ":ads"; + const std::string ads_contents = "Alternate Data Stream"; + + // Create main stream + std::ofstream main_stream(main_stream_name); + main_stream.close(); + + // Attach ADS + std::ofstream ads(ads_name); + ads << ads_contents; + ads.close(); + + // Get file date + time_t modified_date = 0; + time_t accessed_date = 0; + time_t creation_date = 0; + + EXPECT_EQ(MZ_OK, mz_os_get_file_date(ads_name.c_str(), &modified_date, &accessed_date, &creation_date)); + + std::remove(main_stream_name.c_str()); + + ASSERT_GT(modified_date, 0); + ASSERT_GT(accessed_date, 0); + ASSERT_GT(creation_date, 0); +}