All pastes #709264 Raw Edit

Something

public text v1 · immutable
#709264 ·published 2007-09-24 14:50 UTC
rendered paste body
http://trolltech.com/developer/task-tracker/index_html?method=entry&id=154194

--- src/core/io/qfileengine_win.cpp	2007-09-24 14:15:55 -0000
+++ src/core/io/qfileengine_win.cpp	2007-09-24 14:15:55 -0000

@@ -17,6 +17,7 @@
 #include "qfileengine_p.h"
 #include <qfile.h>
 #include <qdir.h>
+#include <qtemporaryfile.h>
 #ifndef QT_NO_REGEXP
 # include <qregexp.h>
 #endif
@@ -1061,8 +1062,55 @@
     return false;
 }
 
-bool QFSFileEngine::setSize(QIODevice::Offset /* size */)
+bool QFSFileEngine::setSize(QIODevice::Offset size)
 {
+    if (d->fd != -1) {
+        // resize open file
+        if (size > this->size()) {
+            QIODevice::Offset currentPos = at();
+            seek(this->size());
+            QByteArray ba(size - this->size());
+            ba.fill(0);
+            if (write(ba.data(), ba.size()) != ba.size()) {
+                seek(currentPos);
+                return false;
+            }
+            seek(currentPos);
+        } else {
+            //### shrink
+            return false;
+        }
+    } else {
+        // resize file on disk
+        QFile file1(QFile::encodeName(d->file));
+        if (file1.open(QFile::ReadOnly)) {
+            QTemporaryFile file2;
+            if (file2.open()) {
+                Q_LONGLONG newSize = 0;
+                char block[1024];
+                while (!file1.atEnd() && newSize < size) {
+                    Q_LONGLONG in = file1.read(block, 1024);
+                    if (in == -1)
+                        break;
+                    in = qMin(size - newSize, in);
+                    if (in != file2.write(block, in)) {
+                        return false;
+                    }
+                    newSize += in;
+                }
+                if (newSize < size) {
+                    QByteArray ba(size - newSize);
+                    ba.fill(0);
+                    if (file2.write(ba) != ba.size())
+                        return false;
+                }
+                file1.close();
+                file2.close();
+                if (file2.rename(file1.fileName()))
+                    return true;
+            }
+        }
+    }
     return false;
 }