OSDN Git Service

PATCH: [ 1512726 ] Fix combining filesize from two values
authorKimmo Varis <kimmov@gmail.com>
Tue, 27 Jun 2006 17:59:49 +0000 (17:59 +0000)
committerKimmo Varis <kimmov@gmail.com>
Tue, 27 Jun 2006 17:59:49 +0000 (17:59 +0000)
Src/Changes.txt
Src/DiffFileInfo.cpp
Src/DirScan.cpp
Src/FileInfo.cpp
Src/FileInfo.h

index ec73098..3ca5ad3 100644 (file)
@@ -6,6 +6,8 @@ Add new items to top.
  PATCH: [ 1512708 ] Fix compile with VS2005
   Also additional cleanup for CCrystalTextView::GetMarginWidth()
   Src/editlib: ccrystaltextview.cpp ccrystaltextview.h
+ PATCH: [ 1512726 ] Fix combining filesize from two values
+  Src: DiffFileInfo.cpp DirScan.cpp FileInfo.cpp FileInfo.h
 
 2006-06-26 Kimmo
  PATCH: [ 1510596 ] Updated Readme-Swedish.txt
index 8c41f4f..c5f7021 100644 (file)
@@ -55,9 +55,10 @@ BOOL DiffFileInfo::Update(LPCTSTR sFilePath)
        {
                mtime64 = FileTimeToInt64(wfd.ftLastWriteTime);
                flags.attributes = wfd.dwFileAttributes;
-               // No size for directory (remains as -1)
+
+               // Folders don't have a size (size remains as -1)
                if ((flags.attributes & FILE_ATTRIBUTE_DIRECTORY) == 0)
-                       size = (wfd.nFileSizeHigh << 32) + wfd.nFileSizeLow;
+                       size = FileInfo::GetSizeFromFindData(wfd);
                FindClose(h);
                Update = TRUE;
        }
index 29e99bf..7e896a1 100644 (file)
@@ -481,7 +481,7 @@ void LoadFiles(const CString & sDir, fentryArray * dirs, fentryArray * files)
                        ent.ctime = CTime(ff.ftCreationTime).GetTime();
                        ent.mtime = CTime(ff.ftLastWriteTime).GetTime();
                        if (!dwIsDirectory)
-                               ent.size = ff.nFileSizeLow + (ff.nFileSizeHigh << 32);
+                               ent.size = FileInfo::GetSizeFromFindData(ff);
                        else
                                ent.size = -1;  // No size for directories
                        ent.name = ff.cFileName;
index dec2fcc..ce048af 100644 (file)
@@ -53,9 +53,9 @@ void FileInfo::Update(CString sFilePath)
                mtime64 = FileTimeToInt64(wfd.ftLastWriteTime);
                flags.attributes = wfd.dwFileAttributes;
 
-               // No size for directory (remains as -1)
+               // No size for directory ( size remains as -1)$
                if ((flags.attributes & FILE_ATTRIBUTE_DIRECTORY) == 0)
-                       size = (wfd.nFileSizeHigh << 32) + wfd.nFileSizeLow;
+                       size = FileInfo::GetSizeFromFindData(wfd);
                FindClose(h);
        }
        mtime = mtime64;
@@ -72,3 +72,28 @@ void FileInfo::Clear()
        version.Empty();
        flags.reset();
 }
+
+/**
+ * @brief Returns 64-bit filesize from Windows Find Data.
+ * This function calculates 64-bit filesize from given find-data where
+ * filesize is in two variables.
+ * @param [in] findData Find-data to get filesize.
+ * @return 64-bit filesize.
+ */
+__int64 FileInfo::GetSizeFromFindData(const WIN32_FIND_DATA & findData)
+{
+       __int64 tmpSize = 0;
+       // Get file's size. If more than 31 bits is needed then we need to
+       // calculate full 64 bits. Since size is signed variable.
+       if (findData.nFileSizeHigh > 0 || findData.nFileSizeLow > INT_MAX)
+       {
+               tmpSize = findData.nFileSizeHigh;
+               tmpSize = tmpSize << 32;
+               tmpSize += findData.nFileSizeLow;
+       }
+       else
+       {
+               tmpSize = findData.nFileSizeLow;
+       }
+       return tmpSize;
+}
index 8d6ee0f..2d6650e 100644 (file)
@@ -51,6 +51,8 @@ struct FileInfo
 
        void Update(CString sFilePath);
        void Clear();
+
+       static __int64 GetSizeFromFindData(const WIN32_FIND_DATA & findData);
 };
 
 #endif // _FILE_INFO_H_INCLUDED