Absolute File Name: | /home/qt/qt5_coco/qt5/qtbase/src/corelib/io/qfile.cpp |
Source code | Switch to Preprocessed file |
Line | Source | Count | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | /**************************************************************************** | - | ||||||||||||
2 | ** | - | ||||||||||||
3 | ** Copyright (C) 2016 The Qt Company Ltd. | - | ||||||||||||
4 | ** Contact: https://www.qt.io/licensing/ | - | ||||||||||||
5 | ** | - | ||||||||||||
6 | ** This file is part of the QtCore module of the Qt Toolkit. | - | ||||||||||||
7 | ** | - | ||||||||||||
8 | ** $QT_BEGIN_LICENSE:LGPL$ | - | ||||||||||||
9 | ** Commercial License Usage | - | ||||||||||||
10 | ** Licensees holding valid commercial Qt licenses may use this file in | - | ||||||||||||
11 | ** accordance with the commercial license agreement provided with the | - | ||||||||||||
12 | ** Software or, alternatively, in accordance with the terms contained in | - | ||||||||||||
13 | ** a written agreement between you and The Qt Company. For licensing terms | - | ||||||||||||
14 | ** and conditions see https://www.qt.io/terms-conditions. For further | - | ||||||||||||
15 | ** information use the contact form at https://www.qt.io/contact-us. | - | ||||||||||||
16 | ** | - | ||||||||||||
17 | ** GNU Lesser General Public License Usage | - | ||||||||||||
18 | ** Alternatively, this file may be used under the terms of the GNU Lesser | - | ||||||||||||
19 | ** General Public License version 3 as published by the Free Software | - | ||||||||||||
20 | ** Foundation and appearing in the file LICENSE.LGPL3 included in the | - | ||||||||||||
21 | ** packaging of this file. Please review the following information to | - | ||||||||||||
22 | ** ensure the GNU Lesser General Public License version 3 requirements | - | ||||||||||||
23 | ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. | - | ||||||||||||
24 | ** | - | ||||||||||||
25 | ** GNU General Public License Usage | - | ||||||||||||
26 | ** Alternatively, this file may be used under the terms of the GNU | - | ||||||||||||
27 | ** General Public License version 2.0 or (at your option) the GNU General | - | ||||||||||||
28 | ** Public license version 3 or any later version approved by the KDE Free | - | ||||||||||||
29 | ** Qt Foundation. The licenses are as published by the Free Software | - | ||||||||||||
30 | ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 | - | ||||||||||||
31 | ** included in the packaging of this file. Please review the following | - | ||||||||||||
32 | ** information to ensure the GNU General Public License requirements will | - | ||||||||||||
33 | ** be met: https://www.gnu.org/licenses/gpl-2.0.html and | - | ||||||||||||
34 | ** https://www.gnu.org/licenses/gpl-3.0.html. | - | ||||||||||||
35 | ** | - | ||||||||||||
36 | ** $QT_END_LICENSE$ | - | ||||||||||||
37 | ** | - | ||||||||||||
38 | ****************************************************************************/ | - | ||||||||||||
39 | - | |||||||||||||
40 | #include "qplatformdefs.h" | - | ||||||||||||
41 | #include "qdebug.h" | - | ||||||||||||
42 | #include "qfile.h" | - | ||||||||||||
43 | #include "qfsfileengine_p.h" | - | ||||||||||||
44 | #include "qtemporaryfile.h" | - | ||||||||||||
45 | #include "qlist.h" | - | ||||||||||||
46 | #include "qfileinfo.h" | - | ||||||||||||
47 | #include "private/qiodevice_p.h" | - | ||||||||||||
48 | #include "private/qfile_p.h" | - | ||||||||||||
49 | #include "private/qfilesystemengine_p.h" | - | ||||||||||||
50 | #include "private/qsystemerror_p.h" | - | ||||||||||||
51 | #if defined(QT_BUILD_CORE_LIB) | - | ||||||||||||
52 | # include "qcoreapplication.h" | - | ||||||||||||
53 | #endif | - | ||||||||||||
54 | - | |||||||||||||
55 | #ifdef QT_NO_QOBJECT | - | ||||||||||||
56 | #define tr(X) QString::fromLatin1(X) | - | ||||||||||||
57 | #endif | - | ||||||||||||
58 | - | |||||||||||||
59 | QT_BEGIN_NAMESPACE | - | ||||||||||||
60 | - | |||||||||||||
61 | //************* QFilePrivate | - | ||||||||||||
62 | QFilePrivate::QFilePrivate() | - | ||||||||||||
63 | { | - | ||||||||||||
64 | } | - | ||||||||||||
65 | - | |||||||||||||
66 | QFilePrivate::~QFilePrivate() | - | ||||||||||||
67 | { | - | ||||||||||||
68 | } | - | ||||||||||||
69 | - | |||||||||||||
70 | bool | - | ||||||||||||
71 | QFilePrivate::openExternalFile(int flags, int fd, QFile::FileHandleFlags handleFlags) | - | ||||||||||||
72 | { | - | ||||||||||||
73 | #ifdef QT_NO_FSFILEENGINE | - | ||||||||||||
74 | Q_UNUSED(flags); | - | ||||||||||||
75 | Q_UNUSED(fd); | - | ||||||||||||
76 | return false; | - | ||||||||||||
77 | #else | - | ||||||||||||
78 | delete fileEngine; | - | ||||||||||||
79 | fileEngine = 0; | - | ||||||||||||
80 | QFSFileEngine *fe = new QFSFileEngine; | - | ||||||||||||
81 | fileEngine = fe; | - | ||||||||||||
82 | return fe->open(QIODevice::OpenMode(flags), fd, handleFlags); executed 29 times by 3 tests: return fe->open(QIODevice::OpenMode(flags), fd, handleFlags); Executed by:
| 29 | ||||||||||||
83 | #endif | - | ||||||||||||
84 | } | - | ||||||||||||
85 | - | |||||||||||||
86 | bool | - | ||||||||||||
87 | QFilePrivate::openExternalFile(int flags, FILE *fh, QFile::FileHandleFlags handleFlags) | - | ||||||||||||
88 | { | - | ||||||||||||
89 | #ifdef QT_NO_FSFILEENGINE | - | ||||||||||||
90 | Q_UNUSED(flags); | - | ||||||||||||
91 | Q_UNUSED(fh); | - | ||||||||||||
92 | return false; | - | ||||||||||||
93 | #else | - | ||||||||||||
94 | delete fileEngine; | - | ||||||||||||
95 | fileEngine = 0; | - | ||||||||||||
96 | QFSFileEngine *fe = new QFSFileEngine; | - | ||||||||||||
97 | fileEngine = fe; | - | ||||||||||||
98 | return fe->open(QIODevice::OpenMode(flags), fh, handleFlags); executed 364 times by 5 tests: return fe->open(QIODevice::OpenMode(flags), fh, handleFlags); Executed by:
| 364 | ||||||||||||
99 | #endif | - | ||||||||||||
100 | } | - | ||||||||||||
101 | - | |||||||||||||
102 | QAbstractFileEngine *QFilePrivate::engine() const | - | ||||||||||||
103 | { | - | ||||||||||||
104 | if (!fileEngine)
| 61986-260564 | ||||||||||||
105 | fileEngine = QAbstractFileEngine::create(fileName); executed 61986 times by 211 tests: fileEngine = QAbstractFileEngine::create(fileName); Executed by:
| 61986 | ||||||||||||
106 | return fileEngine; executed 322550 times by 211 tests: return fileEngine; Executed by:
| 322550 | ||||||||||||
107 | } | - | ||||||||||||
108 | - | |||||||||||||
109 | //************* QFile | - | ||||||||||||
110 | - | |||||||||||||
111 | /*! | - | ||||||||||||
112 | \class QFile | - | ||||||||||||
113 | \inmodule QtCore | - | ||||||||||||
114 | \brief The QFile class provides an interface for reading from and writing to files. | - | ||||||||||||
115 | - | |||||||||||||
116 | \ingroup io | - | ||||||||||||
117 | - | |||||||||||||
118 | \reentrant | - | ||||||||||||
119 | - | |||||||||||||
120 | QFile is an I/O device for reading and writing text and binary | - | ||||||||||||
121 | files and \l{The Qt Resource System}{resources}. A QFile may be | - | ||||||||||||
122 | used by itself or, more conveniently, with a QTextStream or | - | ||||||||||||
123 | QDataStream. | - | ||||||||||||
124 | - | |||||||||||||
125 | The file name is usually passed in the constructor, but it can be | - | ||||||||||||
126 | set at any time using setFileName(). QFile expects the file | - | ||||||||||||
127 | separator to be '/' regardless of operating system. The use of | - | ||||||||||||
128 | other separators (e.g., '\\') is not supported. | - | ||||||||||||
129 | - | |||||||||||||
130 | You can check for a file's existence using exists(), and remove a | - | ||||||||||||
131 | file using remove(). (More advanced file system related operations | - | ||||||||||||
132 | are provided by QFileInfo and QDir.) | - | ||||||||||||
133 | - | |||||||||||||
134 | The file is opened with open(), closed with close(), and flushed | - | ||||||||||||
135 | with flush(). Data is usually read and written using QDataStream | - | ||||||||||||
136 | or QTextStream, but you can also call the QIODevice-inherited | - | ||||||||||||
137 | functions read(), readLine(), readAll(), write(). QFile also | - | ||||||||||||
138 | inherits getChar(), putChar(), and ungetChar(), which work one | - | ||||||||||||
139 | character at a time. | - | ||||||||||||
140 | - | |||||||||||||
141 | The size of the file is returned by size(). You can get the | - | ||||||||||||
142 | current file position using pos(), or move to a new file position | - | ||||||||||||
143 | using seek(). If you've reached the end of the file, atEnd() | - | ||||||||||||
144 | returns \c true. | - | ||||||||||||
145 | - | |||||||||||||
146 | \section1 Reading Files Directly | - | ||||||||||||
147 | - | |||||||||||||
148 | The following example reads a text file line by line: | - | ||||||||||||
149 | - | |||||||||||||
150 | \snippet file/file.cpp 0 | - | ||||||||||||
151 | - | |||||||||||||
152 | The QIODevice::Text flag passed to open() tells Qt to convert | - | ||||||||||||
153 | Windows-style line terminators ("\\r\\n") into C++-style | - | ||||||||||||
154 | terminators ("\\n"). By default, QFile assumes binary, i.e. it | - | ||||||||||||
155 | doesn't perform any conversion on the bytes stored in the file. | - | ||||||||||||
156 | - | |||||||||||||
157 | \section1 Using Streams to Read Files | - | ||||||||||||
158 | - | |||||||||||||
159 | The next example uses QTextStream to read a text file | - | ||||||||||||
160 | line by line: | - | ||||||||||||
161 | - | |||||||||||||
162 | \snippet file/file.cpp 1 | - | ||||||||||||
163 | - | |||||||||||||
164 | QTextStream takes care of converting the 8-bit data stored on | - | ||||||||||||
165 | disk into a 16-bit Unicode QString. By default, it assumes that | - | ||||||||||||
166 | the user system's local 8-bit encoding is used (e.g., UTF-8 | - | ||||||||||||
167 | on most unix based operating systems; see QTextCodec::codecForLocale() for | - | ||||||||||||
168 | details). This can be changed using \l QTextStream::setCodec(). | - | ||||||||||||
169 | - | |||||||||||||
170 | To write text, we can use operator<<(), which is overloaded to | - | ||||||||||||
171 | take a QTextStream on the left and various data types (including | - | ||||||||||||
172 | QString) on the right: | - | ||||||||||||
173 | - | |||||||||||||
174 | \snippet file/file.cpp 2 | - | ||||||||||||
175 | - | |||||||||||||
176 | QDataStream is similar, in that you can use operator<<() to write | - | ||||||||||||
177 | data and operator>>() to read it back. See the class | - | ||||||||||||
178 | documentation for details. | - | ||||||||||||
179 | - | |||||||||||||
180 | When you use QFile, QFileInfo, and QDir to access the file system | - | ||||||||||||
181 | with Qt, you can use Unicode file names. On Unix, these file | - | ||||||||||||
182 | names are converted to an 8-bit encoding. If you want to use | - | ||||||||||||
183 | standard C++ APIs (\c <cstdio> or \c <iostream>) or | - | ||||||||||||
184 | platform-specific APIs to access files instead of QFile, you can | - | ||||||||||||
185 | use the encodeName() and decodeName() functions to convert | - | ||||||||||||
186 | between Unicode file names and 8-bit file names. | - | ||||||||||||
187 | - | |||||||||||||
188 | On Unix, there are some special system files (e.g. in \c /proc) for which | - | ||||||||||||
189 | size() will always return 0, yet you may still be able to read more data | - | ||||||||||||
190 | from such a file; the data is generated in direct response to you calling | - | ||||||||||||
191 | read(). In this case, however, you cannot use atEnd() to determine if | - | ||||||||||||
192 | there is more data to read (since atEnd() will return true for a file that | - | ||||||||||||
193 | claims to have size 0). Instead, you should either call readAll(), or call | - | ||||||||||||
194 | read() or readLine() repeatedly until no more data can be read. The next | - | ||||||||||||
195 | example uses QTextStream to read \c /proc/modules line by line: | - | ||||||||||||
196 | - | |||||||||||||
197 | \snippet file/file.cpp 3 | - | ||||||||||||
198 | - | |||||||||||||
199 | \section1 Signals | - | ||||||||||||
200 | - | |||||||||||||
201 | Unlike other QIODevice implementations, such as QTcpSocket, QFile does not | - | ||||||||||||
202 | emit the aboutToClose(), bytesWritten(), or readyRead() signals. This | - | ||||||||||||
203 | implementation detail means that QFile is not suitable for reading and | - | ||||||||||||
204 | writing certain types of files, such as device files on Unix platforms. | - | ||||||||||||
205 | - | |||||||||||||
206 | \section1 Platform Specific Issues | - | ||||||||||||
207 | - | |||||||||||||
208 | File permissions are handled differently on Unix-like systems and | - | ||||||||||||
209 | Windows. In a non \l{QIODevice::isWritable()}{writable} | - | ||||||||||||
210 | directory on Unix-like systems, files cannot be created. This is not always | - | ||||||||||||
211 | the case on Windows, where, for instance, the 'My Documents' | - | ||||||||||||
212 | directory usually is not writable, but it is still possible to | - | ||||||||||||
213 | create files in it. | - | ||||||||||||
214 | - | |||||||||||||
215 | Qt's understanding of file permissions is limited, which affects especially | - | ||||||||||||
216 | the \l QFile::setPermissions() function. On Windows, Qt will set only the | - | ||||||||||||
217 | legacy read-only flag, and that only when none of the Write* flags are | - | ||||||||||||
218 | passed. Qt does not manipulate access control lists (ACLs), which makes this | - | ||||||||||||
219 | function mostly useless for NTFS volumes. It may still be of use for USB | - | ||||||||||||
220 | sticks that use VFAT file systems. POSIX ACLs are not manipulated, either. | - | ||||||||||||
221 | - | |||||||||||||
222 | \sa QTextStream, QDataStream, QFileInfo, QDir, {The Qt Resource System} | - | ||||||||||||
223 | */ | - | ||||||||||||
224 | - | |||||||||||||
225 | #ifdef QT_NO_QOBJECT | - | ||||||||||||
226 | QFile::QFile() | - | ||||||||||||
227 | : QFileDevice(*new QFilePrivate) | - | ||||||||||||
228 | { | - | ||||||||||||
229 | } | - | ||||||||||||
230 | QFile::QFile(const QString &name) | - | ||||||||||||
231 | : QFileDevice(*new QFilePrivate) | - | ||||||||||||
232 | { | - | ||||||||||||
233 | d_func()->fileName = name; | - | ||||||||||||
234 | } | - | ||||||||||||
235 | QFile::QFile(QFilePrivate &dd) | - | ||||||||||||
236 | : QFileDevice(dd) | - | ||||||||||||
237 | { | - | ||||||||||||
238 | } | - | ||||||||||||
239 | #else | - | ||||||||||||
240 | /*! | - | ||||||||||||
241 | Constructs a QFile object. | - | ||||||||||||
242 | */ | - | ||||||||||||
243 | QFile::QFile() | - | ||||||||||||
244 | : QFileDevice(*new QFilePrivate, 0) | - | ||||||||||||
245 | { | - | ||||||||||||
246 | } executed 889 times by 47 tests: end of block Executed by:
| 889 | ||||||||||||
247 | /*! | - | ||||||||||||
248 | Constructs a new file object with the given \a parent. | - | ||||||||||||
249 | */ | - | ||||||||||||
250 | QFile::QFile(QObject *parent) | - | ||||||||||||
251 | : QFileDevice(*new QFilePrivate, parent) | - | ||||||||||||
252 | { | - | ||||||||||||
253 | } executed 8 times by 2 tests: end of block Executed by:
| 8 | ||||||||||||
254 | /*! | - | ||||||||||||
255 | Constructs a new file object to represent the file with the given \a name. | - | ||||||||||||
256 | */ | - | ||||||||||||
257 | QFile::QFile(const QString &name) | - | ||||||||||||
258 | : QFileDevice(*new QFilePrivate, 0) | - | ||||||||||||
259 | { | - | ||||||||||||
260 | Q_D(QFile); | - | ||||||||||||
261 | d->fileName = name; | - | ||||||||||||
262 | } executed 62066 times by 211 tests: end of block Executed by:
| 62066 | ||||||||||||
263 | /*! | - | ||||||||||||
264 | Constructs a new file object with the given \a parent to represent the | - | ||||||||||||
265 | file with the specified \a name. | - | ||||||||||||
266 | */ | - | ||||||||||||
267 | QFile::QFile(const QString &name, QObject *parent) | - | ||||||||||||
268 | : QFileDevice(*new QFilePrivate, parent) | - | ||||||||||||
269 | { | - | ||||||||||||
270 | Q_D(QFile); | - | ||||||||||||
271 | d->fileName = name; | - | ||||||||||||
272 | } executed 1 time by 1 test: end of block Executed by:
| 1 | ||||||||||||
273 | /*! | - | ||||||||||||
274 | \internal | - | ||||||||||||
275 | */ | - | ||||||||||||
276 | QFile::QFile(QFilePrivate &dd, QObject *parent) | - | ||||||||||||
277 | : QFileDevice(dd, parent) | - | ||||||||||||
278 | { | - | ||||||||||||
279 | } executed 1581 times by 25 tests: end of block Executed by:
| 1581 | ||||||||||||
280 | #endif | - | ||||||||||||
281 | - | |||||||||||||
282 | /*! | - | ||||||||||||
283 | Destroys the file object, closing it if necessary. | - | ||||||||||||
284 | */ | - | ||||||||||||
285 | QFile::~QFile() | - | ||||||||||||
286 | { | - | ||||||||||||
287 | } | - | ||||||||||||
288 | - | |||||||||||||
289 | /*! | - | ||||||||||||
290 | Returns the name set by setFileName() or to the QFile | - | ||||||||||||
291 | constructors. | - | ||||||||||||
292 | - | |||||||||||||
293 | \sa setFileName(), QFileInfo::fileName() | - | ||||||||||||
294 | */ | - | ||||||||||||
295 | QString QFile::fileName() const | - | ||||||||||||
296 | { | - | ||||||||||||
297 | Q_D(const QFile); | - | ||||||||||||
298 | return d->engine()->fileName(QAbstractFileEngine::DefaultName); executed 26052 times by 90 tests: return d->engine()->fileName(QAbstractFileEngine::DefaultName); Executed by:
| 26052 | ||||||||||||
299 | } | - | ||||||||||||
300 | - | |||||||||||||
301 | /*! | - | ||||||||||||
302 | Sets the \a name of the file. The name can have no path, a | - | ||||||||||||
303 | relative path, or an absolute path. | - | ||||||||||||
304 | - | |||||||||||||
305 | Do not call this function if the file has already been opened. | - | ||||||||||||
306 | - | |||||||||||||
307 | If the file name has no path or a relative path, the path used | - | ||||||||||||
308 | will be the application's current directory path | - | ||||||||||||
309 | \e{at the time of the open()} call. | - | ||||||||||||
310 | - | |||||||||||||
311 | Example: | - | ||||||||||||
312 | \snippet code/src_corelib_io_qfile.cpp 0 | - | ||||||||||||
313 | - | |||||||||||||
314 | Note that the directory separator "/" works for all operating | - | ||||||||||||
315 | systems supported by Qt. | - | ||||||||||||
316 | - | |||||||||||||
317 | \sa fileName(), QFileInfo, QDir | - | ||||||||||||
318 | */ | - | ||||||||||||
319 | void | - | ||||||||||||
320 | QFile::setFileName(const QString &name) | - | ||||||||||||
321 | { | - | ||||||||||||
322 | Q_D(QFile); | - | ||||||||||||
323 | if (isOpen()) {
| 0-3075 | ||||||||||||
324 | qWarning("QFile::setFileName: File (%s) is already opened", | - | ||||||||||||
325 | qPrintable(fileName())); | - | ||||||||||||
326 | close(); | - | ||||||||||||
327 | } never executed: end of block | 0 | ||||||||||||
328 | if(d->fileEngine) { //get a new file engine later
| 630-2445 | ||||||||||||
329 | delete d->fileEngine; | - | ||||||||||||
330 | d->fileEngine = 0; | - | ||||||||||||
331 | } executed 2445 times by 16 tests: end of block Executed by:
| 2445 | ||||||||||||
332 | d->fileName = name; | - | ||||||||||||
333 | } executed 3075 times by 43 tests: end of block Executed by:
| 3075 | ||||||||||||
334 | - | |||||||||||||
335 | /*! | - | ||||||||||||
336 | \fn QString QFile::decodeName(const char *localFileName) | - | ||||||||||||
337 | - | |||||||||||||
338 | \overload | - | ||||||||||||
339 | - | |||||||||||||
340 | Returns the Unicode version of the given \a localFileName. See | - | ||||||||||||
341 | encodeName() for details. | - | ||||||||||||
342 | */ | - | ||||||||||||
343 | - | |||||||||||||
344 | /*! | - | ||||||||||||
345 | \fn QByteArray QFile::encodeName(const QString &fileName) | - | ||||||||||||
346 | - | |||||||||||||
347 | Converts \a fileName to the local 8-bit | - | ||||||||||||
348 | encoding determined by the user's locale. This is sufficient for | - | ||||||||||||
349 | file names that the user chooses. File names hard-coded into the | - | ||||||||||||
350 | application should only use 7-bit ASCII filename characters. | - | ||||||||||||
351 | - | |||||||||||||
352 | \sa decodeName() | - | ||||||||||||
353 | */ | - | ||||||||||||
354 | - | |||||||||||||
355 | /*! | - | ||||||||||||
356 | \typedef QFile::EncoderFn | - | ||||||||||||
357 | \obsolete | - | ||||||||||||
358 | - | |||||||||||||
359 | This is a typedef for a pointer to a function with the following | - | ||||||||||||
360 | signature: | - | ||||||||||||
361 | - | |||||||||||||
362 | \snippet code/src_corelib_io_qfile.cpp 1 | - | ||||||||||||
363 | - | |||||||||||||
364 | \sa setEncodingFunction(), encodeName() | - | ||||||||||||
365 | */ | - | ||||||||||||
366 | - | |||||||||||||
367 | /*! | - | ||||||||||||
368 | \fn QString QFile::decodeName(const QByteArray &localFileName) | - | ||||||||||||
369 | - | |||||||||||||
370 | This does the reverse of QFile::encodeName() using \a localFileName. | - | ||||||||||||
371 | - | |||||||||||||
372 | \sa encodeName() | - | ||||||||||||
373 | */ | - | ||||||||||||
374 | - | |||||||||||||
375 | /*! | - | ||||||||||||
376 | \fn void QFile::setEncodingFunction(EncoderFn function) | - | ||||||||||||
377 | \obsolete | - | ||||||||||||
378 | - | |||||||||||||
379 | This function does nothing. It is provided for compatibility with Qt 4 code | - | ||||||||||||
380 | that attempted to set a different encoding function for file names. That | - | ||||||||||||
381 | feature is flawed and no longer supported in Qt 5. | - | ||||||||||||
382 | - | |||||||||||||
383 | \sa encodeName(), setDecodingFunction() | - | ||||||||||||
384 | */ | - | ||||||||||||
385 | - | |||||||||||||
386 | /*! | - | ||||||||||||
387 | \typedef QFile::DecoderFn | - | ||||||||||||
388 | - | |||||||||||||
389 | This is a typedef for a pointer to a function with the following | - | ||||||||||||
390 | signature: | - | ||||||||||||
391 | - | |||||||||||||
392 | \snippet code/src_corelib_io_qfile.cpp 2 | - | ||||||||||||
393 | - | |||||||||||||
394 | \sa setDecodingFunction() | - | ||||||||||||
395 | */ | - | ||||||||||||
396 | - | |||||||||||||
397 | /*! | - | ||||||||||||
398 | \fn void QFile::setDecodingFunction(DecoderFn function) | - | ||||||||||||
399 | \obsolete | - | ||||||||||||
400 | - | |||||||||||||
401 | This function does nothing. It is provided for compatibility with Qt 4 code | - | ||||||||||||
402 | that attempted to set a different decoding function for file names. That | - | ||||||||||||
403 | feature is flawed and no longer supported in Qt 5. | - | ||||||||||||
404 | - | |||||||||||||
405 | \sa setEncodingFunction(), decodeName() | - | ||||||||||||
406 | */ | - | ||||||||||||
407 | - | |||||||||||||
408 | /*! | - | ||||||||||||
409 | \overload | - | ||||||||||||
410 | - | |||||||||||||
411 | Returns \c true if the file specified by fileName() exists; otherwise | - | ||||||||||||
412 | returns \c false. | - | ||||||||||||
413 | - | |||||||||||||
414 | \sa fileName(), setFileName() | - | ||||||||||||
415 | */ | - | ||||||||||||
416 | - | |||||||||||||
417 | bool | - | ||||||||||||
418 | QFile::exists() const | - | ||||||||||||
419 | { | - | ||||||||||||
420 | Q_D(const QFile); | - | ||||||||||||
421 | // 0x1000000 = QAbstractFileEngine::Refresh, forcing an update | - | ||||||||||||
422 | return (d->engine()->fileFlags(QAbstractFileEngine::FlagsMask executed 2484 times by 57 tests: return (d->engine()->fileFlags(QAbstractFileEngine::FlagsMask | QAbstractFileEngine::FileFlag(0x1000000)) & QAbstractFileEngine::ExistsFlag); Executed by:
| 2484 | ||||||||||||
423 | | QAbstractFileEngine::FileFlag(0x1000000)) & QAbstractFileEngine::ExistsFlag); executed 2484 times by 57 tests: return (d->engine()->fileFlags(QAbstractFileEngine::FlagsMask | QAbstractFileEngine::FileFlag(0x1000000)) & QAbstractFileEngine::ExistsFlag); Executed by:
| 2484 | ||||||||||||
424 | } | - | ||||||||||||
425 | - | |||||||||||||
426 | /*! | - | ||||||||||||
427 | Returns \c true if the file specified by \a fileName exists; otherwise | - | ||||||||||||
428 | returns \c false. | - | ||||||||||||
429 | - | |||||||||||||
430 | \note If \a fileName is a symlink that points to a non-existing | - | ||||||||||||
431 | file, false is returned. | - | ||||||||||||
432 | */ | - | ||||||||||||
433 | - | |||||||||||||
434 | bool | - | ||||||||||||
435 | QFile::exists(const QString &fileName) | - | ||||||||||||
436 | { | - | ||||||||||||
437 | return QFileInfo::exists(fileName); executed 12500 times by 218 tests: return QFileInfo::exists(fileName); Executed by:
| 12500 | ||||||||||||
438 | } | - | ||||||||||||
439 | - | |||||||||||||
440 | /*! | - | ||||||||||||
441 | \fn QString QFile::symLinkTarget() const | - | ||||||||||||
442 | \since 4.2 | - | ||||||||||||
443 | \overload | - | ||||||||||||
444 | - | |||||||||||||
445 | Returns the absolute path of the file or directory a symlink (or shortcut | - | ||||||||||||
446 | on Windows) points to, or a an empty string if the object isn't a symbolic | - | ||||||||||||
447 | link. | - | ||||||||||||
448 | - | |||||||||||||
449 | This name may not represent an existing file; it is only a string. | - | ||||||||||||
450 | QFile::exists() returns \c true if the symlink points to an existing file. | - | ||||||||||||
451 | - | |||||||||||||
452 | \sa fileName(), setFileName() | - | ||||||||||||
453 | */ | - | ||||||||||||
454 | - | |||||||||||||
455 | /*! | - | ||||||||||||
456 | \obsolete | - | ||||||||||||
457 | - | |||||||||||||
458 | Use symLinkTarget() instead. | - | ||||||||||||
459 | */ | - | ||||||||||||
460 | QString | - | ||||||||||||
461 | QFile::readLink() const | - | ||||||||||||
462 | { | - | ||||||||||||
463 | Q_D(const QFile); | - | ||||||||||||
464 | return d->engine()->fileName(QAbstractFileEngine::LinkName); executed 2 times by 1 test: return d->engine()->fileName(QAbstractFileEngine::LinkName); Executed by:
| 2 | ||||||||||||
465 | } | - | ||||||||||||
466 | - | |||||||||||||
467 | /*! | - | ||||||||||||
468 | \fn static QString QFile::symLinkTarget(const QString &fileName) | - | ||||||||||||
469 | \since 4.2 | - | ||||||||||||
470 | - | |||||||||||||
471 | Returns the absolute path of the file or directory referred to by the | - | ||||||||||||
472 | symlink (or shortcut on Windows) specified by \a fileName, or returns an | - | ||||||||||||
473 | empty string if the \a fileName does not correspond to a symbolic link. | - | ||||||||||||
474 | - | |||||||||||||
475 | This name may not represent an existing file; it is only a string. | - | ||||||||||||
476 | QFile::exists() returns \c true if the symlink points to an existing file. | - | ||||||||||||
477 | */ | - | ||||||||||||
478 | - | |||||||||||||
479 | /*! | - | ||||||||||||
480 | \obsolete | - | ||||||||||||
481 | - | |||||||||||||
482 | Use symLinkTarget() instead. | - | ||||||||||||
483 | */ | - | ||||||||||||
484 | QString | - | ||||||||||||
485 | QFile::readLink(const QString &fileName) | - | ||||||||||||
486 | { | - | ||||||||||||
487 | return QFileInfo(fileName).readLink(); executed 1 time by 1 test: return QFileInfo(fileName).readLink(); Executed by:
| 1 | ||||||||||||
488 | } | - | ||||||||||||
489 | - | |||||||||||||
490 | /*! | - | ||||||||||||
491 | Removes the file specified by fileName(). Returns \c true if successful; | - | ||||||||||||
492 | otherwise returns \c false. | - | ||||||||||||
493 | - | |||||||||||||
494 | The file is closed before it is removed. | - | ||||||||||||
495 | - | |||||||||||||
496 | \sa setFileName() | - | ||||||||||||
497 | */ | - | ||||||||||||
498 | - | |||||||||||||
499 | bool | - | ||||||||||||
500 | QFile::remove() | - | ||||||||||||
501 | { | - | ||||||||||||
502 | Q_D(QFile); | - | ||||||||||||
503 | if (d->fileName.isEmpty()) {
| 0-13262 | ||||||||||||
504 | qWarning("QFile::remove: Empty or null file name"); | - | ||||||||||||
505 | return false; never executed: return false; | 0 | ||||||||||||
506 | } | - | ||||||||||||
507 | unsetError(); | - | ||||||||||||
508 | close(); | - | ||||||||||||
509 | if(error() == QFile::NoError) {
| 0-13262 | ||||||||||||
510 | if (d->engine()->remove()) {
| 596-12666 | ||||||||||||
511 | unsetError(); | - | ||||||||||||
512 | return true; executed 12666 times by 76 tests: return true; Executed by:
| 12666 | ||||||||||||
513 | } | - | ||||||||||||
514 | d->setError(QFile::RemoveError, d->fileEngine->errorString()); | - | ||||||||||||
515 | } executed 596 times by 21 tests: end of block Executed by:
| 596 | ||||||||||||
516 | return false; executed 596 times by 21 tests: return false; Executed by:
| 596 | ||||||||||||
517 | } | - | ||||||||||||
518 | - | |||||||||||||
519 | /*! | - | ||||||||||||
520 | \overload | - | ||||||||||||
521 | - | |||||||||||||
522 | Removes the file specified by the \a fileName given. | - | ||||||||||||
523 | - | |||||||||||||
524 | Returns \c true if successful; otherwise returns \c false. | - | ||||||||||||
525 | - | |||||||||||||
526 | \sa remove() | - | ||||||||||||
527 | */ | - | ||||||||||||
528 | - | |||||||||||||
529 | bool | - | ||||||||||||
530 | QFile::remove(const QString &fileName) | - | ||||||||||||
531 | { | - | ||||||||||||
532 | return QFile(fileName).remove(); executed 11763 times by 68 tests: return QFile(fileName).remove(); Executed by:
| 11763 | ||||||||||||
533 | } | - | ||||||||||||
534 | - | |||||||||||||
535 | /*! | - | ||||||||||||
536 | Renames the file currently specified by fileName() to \a newName. | - | ||||||||||||
537 | Returns \c true if successful; otherwise returns \c false. | - | ||||||||||||
538 | - | |||||||||||||
539 | If a file with the name \a newName already exists, rename() returns \c false | - | ||||||||||||
540 | (i.e., QFile will not overwrite it). | - | ||||||||||||
541 | - | |||||||||||||
542 | The file is closed before it is renamed. | - | ||||||||||||
543 | - | |||||||||||||
544 | If the rename operation fails, Qt will attempt to copy this file's | - | ||||||||||||
545 | contents to \a newName, and then remove this file, keeping only | - | ||||||||||||
546 | \a newName. If that copy operation fails or this file can't be removed, | - | ||||||||||||
547 | the destination file \a newName is removed to restore the old state. | - | ||||||||||||
548 | - | |||||||||||||
549 | \sa setFileName() | - | ||||||||||||
550 | */ | - | ||||||||||||
551 | - | |||||||||||||
552 | bool | - | ||||||||||||
553 | QFile::rename(const QString &newName) | - | ||||||||||||
554 | { | - | ||||||||||||
555 | Q_D(QFile); | - | ||||||||||||
556 | if (d->fileName.isEmpty()) {
| 0-259 | ||||||||||||
557 | qWarning("QFile::rename: Empty or null file name"); | - | ||||||||||||
558 | return false; never executed: return false; | 0 | ||||||||||||
559 | } | - | ||||||||||||
560 | if (d->fileName == newName) {
| 1-258 | ||||||||||||
561 | d->setError(QFile::RenameError, tr("Destination file is the same file.")); | - | ||||||||||||
562 | return false; executed 1 time by 1 test: return false; Executed by:
| 1 | ||||||||||||
563 | } | - | ||||||||||||
564 | if (!exists()) {
| 2-256 | ||||||||||||
565 | d->setError(QFile::RenameError, tr("Source file does not exist.")); | - | ||||||||||||
566 | return false; executed 2 times by 1 test: return false; Executed by:
| 2 | ||||||||||||
567 | } | - | ||||||||||||
568 | // If the file exists and it is a case-changing rename ("foo" -> "Foo"), | - | ||||||||||||
569 | // compare Ids to make sure it really is a different file. | - | ||||||||||||
570 | if (QFile::exists(newName)) {
| 4-252 | ||||||||||||
571 | if (d->fileName.compare(newName, Qt::CaseInsensitive)
| 0-4 | ||||||||||||
572 | || QFileSystemEngine::id(QFileSystemEntry(d->fileName)) != QFileSystemEngine::id(QFileSystemEntry(newName))) {
| 0 | ||||||||||||
573 | // ### Race condition. If a file is moved in after this, it /will/ be | - | ||||||||||||
574 | // overwritten. On Unix, the proper solution is to use hardlinks: | - | ||||||||||||
575 | // return ::link(old, new) && ::remove(old); | - | ||||||||||||
576 | d->setError(QFile::RenameError, tr("Destination file exists")); | - | ||||||||||||
577 | return false; executed 4 times by 1 test: return false; Executed by:
| 4 | ||||||||||||
578 | } | - | ||||||||||||
579 | #ifndef QT_NO_TEMPORARYFILE | - | ||||||||||||
580 | // This #ifndef disables the workaround it encloses. Therefore, this configuration is not recommended. | - | ||||||||||||
581 | #ifdef Q_OS_LINUX | - | ||||||||||||
582 | // rename() on Linux simply does nothing when renaming "foo" to "Foo" on a case-insensitive | - | ||||||||||||
583 | // FS, such as FAT32. Move the file away and rename in 2 steps to work around. | - | ||||||||||||
584 | QTemporaryFile tempFile(d->fileName + QLatin1String(".XXXXXX")); | - | ||||||||||||
585 | tempFile.setAutoRemove(false); | - | ||||||||||||
586 | if (!tempFile.open(QIODevice::ReadWrite)) {
| 0 | ||||||||||||
587 | d->setError(QFile::RenameError, tempFile.errorString()); | - | ||||||||||||
588 | return false; never executed: return false; | 0 | ||||||||||||
589 | } | - | ||||||||||||
590 | tempFile.close(); | - | ||||||||||||
591 | if (!d->engine()->rename(tempFile.fileName())) {
| 0 | ||||||||||||
592 | d->setError(QFile::RenameError, tr("Error while renaming.")); | - | ||||||||||||
593 | return false; never executed: return false; | 0 | ||||||||||||
594 | } | - | ||||||||||||
595 | if (tempFile.rename(newName)) {
| 0 | ||||||||||||
596 | d->fileEngine->setFileName(newName); | - | ||||||||||||
597 | d->fileName = newName; | - | ||||||||||||
598 | return true; never executed: return true; | 0 | ||||||||||||
599 | } | - | ||||||||||||
600 | d->setError(QFile::RenameError, tempFile.errorString()); | - | ||||||||||||
601 | // We need to restore the original file. | - | ||||||||||||
602 | if (!tempFile.rename(d->fileName)) {
| 0 | ||||||||||||
603 | d->setError(QFile::RenameError, errorString() + QLatin1Char('\n') | - | ||||||||||||
604 | + tr("Unable to restore from %1: %2"). | - | ||||||||||||
605 | arg(QDir::toNativeSeparators(tempFile.fileName()), tempFile.errorString())); | - | ||||||||||||
606 | } never executed: end of block | 0 | ||||||||||||
607 | return false; never executed: return false; | 0 | ||||||||||||
608 | #endif // Q_OS_LINUX | - | ||||||||||||
609 | #endif // QT_NO_TEMPORARYFILE | - | ||||||||||||
610 | } | - | ||||||||||||
611 | unsetError(); | - | ||||||||||||
612 | close(); | - | ||||||||||||
613 | if(error() == QFile::NoError) {
| 0-252 | ||||||||||||
614 | if (d->engine()->rename(newName)) {
| 4-248 | ||||||||||||
615 | unsetError(); | - | ||||||||||||
616 | // engine was able to handle the new name so we just reset it | - | ||||||||||||
617 | d->fileEngine->setFileName(newName); | - | ||||||||||||
618 | d->fileName = newName; | - | ||||||||||||
619 | return true; executed 248 times by 14 tests: return true; Executed by:
| 248 | ||||||||||||
620 | } | - | ||||||||||||
621 | - | |||||||||||||
622 | if (isSequential()) {
| 0-4 | ||||||||||||
623 | d->setError(QFile::RenameError, tr("Will not rename sequential file using block copy")); | - | ||||||||||||
624 | return false; never executed: return false; | 0 | ||||||||||||
625 | } | - | ||||||||||||
626 | - | |||||||||||||
627 | QFile out(newName); | - | ||||||||||||
628 | if (open(QIODevice::ReadOnly)) {
| 0-4 | ||||||||||||
629 | if (out.open(QIODevice::WriteOnly | QIODevice::Truncate)) {
| 1-3 | ||||||||||||
630 | bool error = false; | - | ||||||||||||
631 | char block[4096]; | - | ||||||||||||
632 | qint64 bytes; | - | ||||||||||||
633 | while ((bytes = read(block, sizeof(block))) > 0) {
| 1 | ||||||||||||
634 | if (bytes != out.write(block, bytes)) {
| 0-1 | ||||||||||||
635 | d->setError(QFile::RenameError, out.errorString()); | - | ||||||||||||
636 | error = true; | - | ||||||||||||
637 | break; never executed: break; | 0 | ||||||||||||
638 | } | - | ||||||||||||
639 | } executed 1 time by 1 test: end of block Executed by:
| 1 | ||||||||||||
640 | if (bytes == -1) {
| 0-1 | ||||||||||||
641 | d->setError(QFile::RenameError, errorString()); | - | ||||||||||||
642 | error = true; | - | ||||||||||||
643 | } never executed: end of block | 0 | ||||||||||||
644 | if(!error) {
| 0-1 | ||||||||||||
645 | if (!remove()) {
| 0-1 | ||||||||||||
646 | d->setError(QFile::RenameError, tr("Cannot remove source file")); | - | ||||||||||||
647 | error = true; | - | ||||||||||||
648 | } executed 1 time by 1 test: end of block Executed by:
| 1 | ||||||||||||
649 | } executed 1 time by 1 test: end of block Executed by:
| 1 | ||||||||||||
650 | if (error) {
| 0-1 | ||||||||||||
651 | out.remove(); | - | ||||||||||||
652 | } else { executed 1 time by 1 test: end of block Executed by:
| 1 | ||||||||||||
653 | d->fileEngine->setFileName(newName); | - | ||||||||||||
654 | setPermissions(permissions()); | - | ||||||||||||
655 | unsetError(); | - | ||||||||||||
656 | setFileName(newName); | - | ||||||||||||
657 | } never executed: end of block | 0 | ||||||||||||
658 | close(); | - | ||||||||||||
659 | return !error; executed 1 time by 1 test: return !error; Executed by:
| 1 | ||||||||||||
660 | } | - | ||||||||||||
661 | close(); | - | ||||||||||||
662 | } executed 3 times by 3 tests: end of block Executed by:
| 3 | ||||||||||||
663 | d->setError(QFile::RenameError, out.isOpen() ? errorString() : out.errorString()); | - | ||||||||||||
664 | } executed 3 times by 3 tests: end of block Executed by:
| 3 | ||||||||||||
665 | return false; executed 3 times by 3 tests: return false; Executed by:
| 3 | ||||||||||||
666 | } | - | ||||||||||||
667 | - | |||||||||||||
668 | /*! | - | ||||||||||||
669 | \overload | - | ||||||||||||
670 | - | |||||||||||||
671 | Renames the file \a oldName to \a newName. Returns \c true if | - | ||||||||||||
672 | successful; otherwise returns \c false. | - | ||||||||||||
673 | - | |||||||||||||
674 | If a file with the name \a newName already exists, rename() returns \c false | - | ||||||||||||
675 | (i.e., QFile will not overwrite it). | - | ||||||||||||
676 | - | |||||||||||||
677 | \sa rename() | - | ||||||||||||
678 | */ | - | ||||||||||||
679 | - | |||||||||||||
680 | bool | - | ||||||||||||
681 | QFile::rename(const QString &oldName, const QString &newName) | - | ||||||||||||
682 | { | - | ||||||||||||
683 | return QFile(oldName).rename(newName); executed 8 times by 3 tests: return QFile(oldName).rename(newName); Executed by:
| 8 | ||||||||||||
684 | } | - | ||||||||||||
685 | - | |||||||||||||
686 | /*! | - | ||||||||||||
687 | - | |||||||||||||
688 | Creates a link named \a linkName that points to the file currently specified by | - | ||||||||||||
689 | fileName(). What a link is depends on the underlying filesystem (be it a | - | ||||||||||||
690 | shortcut on Windows or a symbolic link on Unix). Returns \c true if successful; | - | ||||||||||||
691 | otherwise returns \c false. | - | ||||||||||||
692 | - | |||||||||||||
693 | This function will not overwrite an already existing entity in the file system; | - | ||||||||||||
694 | in this case, \c link() will return false and set \l{QFile::}{error()} to | - | ||||||||||||
695 | return \l{QFile::}{RenameError}. | - | ||||||||||||
696 | - | |||||||||||||
697 | \note To create a valid link on Windows, \a linkName must have a \c{.lnk} file extension. | - | ||||||||||||
698 | - | |||||||||||||
699 | \sa setFileName() | - | ||||||||||||
700 | */ | - | ||||||||||||
701 | - | |||||||||||||
702 | bool | - | ||||||||||||
703 | QFile::link(const QString &linkName) | - | ||||||||||||
704 | { | - | ||||||||||||
705 | Q_D(QFile); | - | ||||||||||||
706 | if (d->fileName.isEmpty()) {
| 0-161 | ||||||||||||
707 | qWarning("QFile::link: Empty or null file name"); | - | ||||||||||||
708 | return false; never executed: return false; | 0 | ||||||||||||
709 | } | - | ||||||||||||
710 | QFileInfo fi(linkName); | - | ||||||||||||
711 | if (d->engine()->link(fi.absoluteFilePath())) {
| 0-161 | ||||||||||||
712 | unsetError(); | - | ||||||||||||
713 | return true; executed 161 times by 8 tests: return true; Executed by:
| 161 | ||||||||||||
714 | } | - | ||||||||||||
715 | d->setError(QFile::RenameError, d->fileEngine->errorString()); | - | ||||||||||||
716 | return false; never executed: return false; | 0 | ||||||||||||
717 | } | - | ||||||||||||
718 | - | |||||||||||||
719 | /*! | - | ||||||||||||
720 | \overload | - | ||||||||||||
721 | - | |||||||||||||
722 | Creates a link named \a linkName that points to the file \a fileName. What a link is | - | ||||||||||||
723 | depends on the underlying filesystem (be it a shortcut on Windows | - | ||||||||||||
724 | or a symbolic link on Unix). Returns \c true if successful; otherwise | - | ||||||||||||
725 | returns \c false. | - | ||||||||||||
726 | - | |||||||||||||
727 | \sa link() | - | ||||||||||||
728 | */ | - | ||||||||||||
729 | - | |||||||||||||
730 | bool | - | ||||||||||||
731 | QFile::link(const QString &fileName, const QString &linkName) | - | ||||||||||||
732 | { | - | ||||||||||||
733 | return QFile(fileName).link(linkName); executed 151 times by 5 tests: return QFile(fileName).link(linkName); Executed by:
| 151 | ||||||||||||
734 | } | - | ||||||||||||
735 | - | |||||||||||||
736 | /*! | - | ||||||||||||
737 | Copies the file currently specified by fileName() to a file called | - | ||||||||||||
738 | \a newName. Returns \c true if successful; otherwise returns \c false. | - | ||||||||||||
739 | - | |||||||||||||
740 | Note that if a file with the name \a newName already exists, | - | ||||||||||||
741 | copy() returns \c false (i.e. QFile will not overwrite it). | - | ||||||||||||
742 | - | |||||||||||||
743 | The source file is closed before it is copied. | - | ||||||||||||
744 | - | |||||||||||||
745 | \sa setFileName() | - | ||||||||||||
746 | */ | - | ||||||||||||
747 | - | |||||||||||||
748 | bool | - | ||||||||||||
749 | QFile::copy(const QString &newName) | - | ||||||||||||
750 | { | - | ||||||||||||
751 | Q_D(QFile); | - | ||||||||||||
752 | if (d->fileName.isEmpty()) {
| 0-137 | ||||||||||||
753 | qWarning("QFile::copy: Empty or null file name"); | - | ||||||||||||
754 | return false; never executed: return false; | 0 | ||||||||||||
755 | } | - | ||||||||||||
756 | if (QFile::exists(newName)) {
| 3-134 | ||||||||||||
757 | // ### Race condition. If a file is moved in after this, it /will/ be | - | ||||||||||||
758 | // overwritten. On Unix, the proper solution is to use hardlinks: | - | ||||||||||||
759 | // return ::link(old, new) && ::remove(old); See also rename(). | - | ||||||||||||
760 | d->setError(QFile::CopyError, tr("Destination file exists")); | - | ||||||||||||
761 | return false; executed 3 times by 1 test: return false; Executed by:
| 3 | ||||||||||||
762 | } | - | ||||||||||||
763 | unsetError(); | - | ||||||||||||
764 | close(); | - | ||||||||||||
765 | if(error() == QFile::NoError) {
| 0-134 | ||||||||||||
766 | if (d->engine()->copy(newName)) {
| 0-134 | ||||||||||||
767 | unsetError(); | - | ||||||||||||
768 | return true; never executed: return true; | 0 | ||||||||||||
769 | } else { | - | ||||||||||||
770 | bool error = false; | - | ||||||||||||
771 | if(!open(QFile::ReadOnly)) {
| 1-133 | ||||||||||||
772 | error = true; | - | ||||||||||||
773 | d->setError(QFile::CopyError, tr("Cannot open %1 for input").arg(d->fileName)); | - | ||||||||||||
774 | } else { executed 1 time by 1 test: end of block Executed by:
| 1 | ||||||||||||
775 | QString fileTemplate = QLatin1String("%1/qt_temp.XXXXXX"); | - | ||||||||||||
776 | #ifdef QT_NO_TEMPORARYFILE | - | ||||||||||||
777 | QFile out(fileTemplate.arg(QFileInfo(newName).path())); | - | ||||||||||||
778 | if (!out.open(QIODevice::ReadWrite)) | - | ||||||||||||
779 | error = true; | - | ||||||||||||
780 | #else | - | ||||||||||||
781 | QTemporaryFile out(fileTemplate.arg(QFileInfo(newName).path())); | - | ||||||||||||
782 | if (!out.open()) {
| 0-133 | ||||||||||||
783 | out.setFileTemplate(fileTemplate.arg(QDir::tempPath())); | - | ||||||||||||
784 | if (!out.open())
| 0 | ||||||||||||
785 | error = true; never executed: error = true; | 0 | ||||||||||||
786 | } never executed: end of block | 0 | ||||||||||||
787 | #endif | - | ||||||||||||
788 | if (error) {
| 0-133 | ||||||||||||
789 | out.close(); | - | ||||||||||||
790 | close(); | - | ||||||||||||
791 | d->setError(QFile::CopyError, tr("Cannot open for output")); | - | ||||||||||||
792 | } else { never executed: end of block | 0 | ||||||||||||
793 | char block[4096]; | - | ||||||||||||
794 | qint64 totalRead = 0; | - | ||||||||||||
795 | while(!atEnd()) {
| 133-1271 | ||||||||||||
796 | qint64 in = read(block, sizeof(block)); | - | ||||||||||||
797 | if (in <= 0)
| 0-1271 | ||||||||||||
798 | break; never executed: break; | 0 | ||||||||||||
799 | totalRead += in; | - | ||||||||||||
800 | if(in != out.write(block, in)) {
| 0-1271 | ||||||||||||
801 | close(); | - | ||||||||||||
802 | d->setError(QFile::CopyError, tr("Failure to write block")); | - | ||||||||||||
803 | error = true; | - | ||||||||||||
804 | break; never executed: break; | 0 | ||||||||||||
805 | } | - | ||||||||||||
806 | } executed 1271 times by 5 tests: end of block Executed by:
| 1271 | ||||||||||||
807 | - | |||||||||||||
808 | if (totalRead != size()) {
| 0-133 | ||||||||||||
809 | // Unable to read from the source. The error string is | - | ||||||||||||
810 | // already set from read(). | - | ||||||||||||
811 | error = true; | - | ||||||||||||
812 | } never executed: end of block | 0 | ||||||||||||
813 | if (!error && !out.rename(newName)) {
| 0-133 | ||||||||||||
814 | error = true; | - | ||||||||||||
815 | close(); | - | ||||||||||||
816 | d->setError(QFile::CopyError, tr("Cannot create %1 for output").arg(newName)); | - | ||||||||||||
817 | } never executed: end of block | 0 | ||||||||||||
818 | #ifdef QT_NO_TEMPORARYFILE | - | ||||||||||||
819 | if (error) | - | ||||||||||||
820 | out.remove(); | - | ||||||||||||
821 | #else | - | ||||||||||||
822 | if (!error)
| 0-133 | ||||||||||||
823 | out.setAutoRemove(false); executed 133 times by 5 tests: out.setAutoRemove(false); Executed by:
| 133 | ||||||||||||
824 | #endif | - | ||||||||||||
825 | } executed 133 times by 5 tests: end of block Executed by:
| 133 | ||||||||||||
826 | } | - | ||||||||||||
827 | if(!error) {
| 1-133 | ||||||||||||
828 | QFile::setPermissions(newName, permissions()); | - | ||||||||||||
829 | close(); | - | ||||||||||||
830 | unsetError(); | - | ||||||||||||
831 | return true; executed 133 times by 5 tests: return true; Executed by:
| 133 | ||||||||||||
832 | } | - | ||||||||||||
833 | } executed 1 time by 1 test: end of block Executed by:
| 1 | ||||||||||||
834 | } | - | ||||||||||||
835 | return false; executed 1 time by 1 test: return false; Executed by:
| 1 | ||||||||||||
836 | } | - | ||||||||||||
837 | - | |||||||||||||
838 | /*! | - | ||||||||||||
839 | \overload | - | ||||||||||||
840 | - | |||||||||||||
841 | Copies the file \a fileName to \a newName. Returns \c true if successful; | - | ||||||||||||
842 | otherwise returns \c false. | - | ||||||||||||
843 | - | |||||||||||||
844 | If a file with the name \a newName already exists, copy() returns \c false | - | ||||||||||||
845 | (i.e., QFile will not overwrite it). | - | ||||||||||||
846 | - | |||||||||||||
847 | \sa rename() | - | ||||||||||||
848 | */ | - | ||||||||||||
849 | - | |||||||||||||
850 | bool | - | ||||||||||||
851 | QFile::copy(const QString &fileName, const QString &newName) | - | ||||||||||||
852 | { | - | ||||||||||||
853 | return QFile(fileName).copy(newName); executed 101 times by 3 tests: return QFile(fileName).copy(newName); Executed by:
| 101 | ||||||||||||
854 | } | - | ||||||||||||
855 | - | |||||||||||||
856 | /*! | - | ||||||||||||
857 | Opens the file using OpenMode \a mode, returning true if successful; | - | ||||||||||||
858 | otherwise false. | - | ||||||||||||
859 | - | |||||||||||||
860 | The \a mode must be QIODevice::ReadOnly, QIODevice::WriteOnly, or | - | ||||||||||||
861 | QIODevice::ReadWrite. It may also have additional flags, such as | - | ||||||||||||
862 | QIODevice::Text and QIODevice::Unbuffered. | - | ||||||||||||
863 | - | |||||||||||||
864 | \note In \l{QIODevice::}{WriteOnly} or \l{QIODevice::}{ReadWrite} | - | ||||||||||||
865 | mode, if the relevant file does not already exist, this function | - | ||||||||||||
866 | will try to create a new file before opening it. | - | ||||||||||||
867 | - | |||||||||||||
868 | \sa QIODevice::OpenMode, setFileName() | - | ||||||||||||
869 | */ | - | ||||||||||||
870 | bool QFile::open(OpenMode mode) | - | ||||||||||||
871 | { | - | ||||||||||||
872 | Q_D(QFile); | - | ||||||||||||
873 | if (isOpen()) {
| 0-48863 | ||||||||||||
874 | qWarning("QFile::open: File (%s) already open", qPrintable(fileName())); | - | ||||||||||||
875 | return false; never executed: return false; | 0 | ||||||||||||
876 | } | - | ||||||||||||
877 | if (mode & Append)
| 259-48604 | ||||||||||||
878 | mode |= WriteOnly; executed 259 times by 6 tests: mode |= WriteOnly; Executed by:
| 259 | ||||||||||||
879 | - | |||||||||||||
880 | unsetError(); | - | ||||||||||||
881 | if ((mode & (ReadOnly | WriteOnly)) == 0) {
| 0-48863 | ||||||||||||
882 | qWarning("QIODevice::open: File access not specified"); | - | ||||||||||||
883 | return false; never executed: return false; | 0 | ||||||||||||
884 | } | - | ||||||||||||
885 | - | |||||||||||||
886 | // QIODevice provides the buffering, so there's no need to request it from the file engine. | - | ||||||||||||
887 | if (d->engine()->open(mode | QIODevice::Unbuffered)) {
| 3710-45153 | ||||||||||||
888 | QIODevice::open(mode); | - | ||||||||||||
889 | if (mode & Append)
| 258-44895 | ||||||||||||
890 | seek(size()); executed 258 times by 6 tests: seek(size()); Executed by:
| 258 | ||||||||||||
891 | return true; executed 45153 times by 177 tests: return true; Executed by:
| 45153 | ||||||||||||
892 | } | - | ||||||||||||
893 | QFile::FileError err = d->fileEngine->error(); | - | ||||||||||||
894 | if(err == QFile::UnspecifiedError)
| 215-3495 | ||||||||||||
895 | err = QFile::OpenError; executed 215 times by 8 tests: err = QFile::OpenError; Executed by:
| 215 | ||||||||||||
896 | d->setError(err, d->fileEngine->errorString()); | - | ||||||||||||
897 | return false; executed 3710 times by 53 tests: return false; Executed by:
| 3710 | ||||||||||||
898 | } | - | ||||||||||||
899 | - | |||||||||||||
900 | /*! | - | ||||||||||||
901 | \overload | - | ||||||||||||
902 | - | |||||||||||||
903 | Opens the existing file handle \a fh in the given \a mode. | - | ||||||||||||
904 | \a handleFlags may be used to specify additional options. | - | ||||||||||||
905 | Returns \c true if successful; otherwise returns \c false. | - | ||||||||||||
906 | - | |||||||||||||
907 | Example: | - | ||||||||||||
908 | \snippet code/src_corelib_io_qfile.cpp 3 | - | ||||||||||||
909 | - | |||||||||||||
910 | When a QFile is opened using this function, behaviour of close() is | - | ||||||||||||
911 | controlled by the AutoCloseHandle flag. | - | ||||||||||||
912 | If AutoCloseHandle is specified, and this function succeeds, | - | ||||||||||||
913 | then calling close() closes the adopted handle. | - | ||||||||||||
914 | Otherwise, close() does not actually close the file, but only flushes it. | - | ||||||||||||
915 | - | |||||||||||||
916 | \b{Warning:} | - | ||||||||||||
917 | \list 1 | - | ||||||||||||
918 | \li If \a fh does not refer to a regular file, e.g., it is \c stdin, | - | ||||||||||||
919 | \c stdout, or \c stderr, you may not be able to seek(). size() | - | ||||||||||||
920 | returns \c 0 in those cases. See QIODevice::isSequential() for | - | ||||||||||||
921 | more information. | - | ||||||||||||
922 | \li Since this function opens the file without specifying the file name, | - | ||||||||||||
923 | you cannot use this QFile with a QFileInfo. | - | ||||||||||||
924 | \endlist | - | ||||||||||||
925 | - | |||||||||||||
926 | \sa close() | - | ||||||||||||
927 | - | |||||||||||||
928 | \b{Note for the Windows Platform} | - | ||||||||||||
929 | - | |||||||||||||
930 | \a fh must be opened in binary mode (i.e., the mode string must contain | - | ||||||||||||
931 | 'b', as in "rb" or "wb") when accessing files and other random-access | - | ||||||||||||
932 | devices. Qt will translate the end-of-line characters if you pass | - | ||||||||||||
933 | QIODevice::Text to \a mode. Sequential devices, such as stdin and stdout, | - | ||||||||||||
934 | are unaffected by this limitation. | - | ||||||||||||
935 | - | |||||||||||||
936 | You need to enable support for console applications in order to use the | - | ||||||||||||
937 | stdin, stdout and stderr streams at the console. To do this, add the | - | ||||||||||||
938 | following declaration to your application's project file: | - | ||||||||||||
939 | - | |||||||||||||
940 | \snippet code/src_corelib_io_qfile.cpp 4 | - | ||||||||||||
941 | */ | - | ||||||||||||
942 | bool QFile::open(FILE *fh, OpenMode mode, FileHandleFlags handleFlags) | - | ||||||||||||
943 | { | - | ||||||||||||
944 | Q_D(QFile); | - | ||||||||||||
945 | if (isOpen()) {
| 0-364 | ||||||||||||
946 | qWarning("QFile::open: File (%s) already open", qPrintable(fileName())); | - | ||||||||||||
947 | return false; never executed: return false; | 0 | ||||||||||||
948 | } | - | ||||||||||||
949 | if (mode & Append)
| 0-364 | ||||||||||||
950 | mode |= WriteOnly; never executed: mode |= WriteOnly; | 0 | ||||||||||||
951 | unsetError(); | - | ||||||||||||
952 | if ((mode & (ReadOnly | WriteOnly)) == 0) {
| 0-364 | ||||||||||||
953 | qWarning("QFile::open: File access not specified"); | - | ||||||||||||
954 | return false; never executed: return false; | 0 | ||||||||||||
955 | } | - | ||||||||||||
956 | if (d->openExternalFile(mode, fh, handleFlags)) {
| 0-364 | ||||||||||||
957 | QIODevice::open(mode); | - | ||||||||||||
958 | if (!(mode & Append) && !isSequential()) {
| 0-364 | ||||||||||||
959 | qint64 pos = (qint64)QT_FTELL(fh); | - | ||||||||||||
960 | if (pos != -1) {
| 0-27 | ||||||||||||
961 | // Skip redundant checks in QFileDevice::seek(). | - | ||||||||||||
962 | QIODevice::seek(pos); | - | ||||||||||||
963 | } executed 27 times by 2 tests: end of block Executed by:
| 27 | ||||||||||||
964 | } executed 27 times by 2 tests: end of block Executed by:
| 27 | ||||||||||||
965 | return true; executed 364 times by 5 tests: return true; Executed by:
| 364 | ||||||||||||
966 | } | - | ||||||||||||
967 | return false; never executed: return false; | 0 | ||||||||||||
968 | } | - | ||||||||||||
969 | - | |||||||||||||
970 | /*! | - | ||||||||||||
971 | \overload | - | ||||||||||||
972 | - | |||||||||||||
973 | Opens the existing file descriptor \a fd in the given \a mode. | - | ||||||||||||
974 | \a handleFlags may be used to specify additional options. | - | ||||||||||||
975 | Returns \c true if successful; otherwise returns \c false. | - | ||||||||||||
976 | - | |||||||||||||
977 | When a QFile is opened using this function, behaviour of close() is | - | ||||||||||||
978 | controlled by the AutoCloseHandle flag. | - | ||||||||||||
979 | If AutoCloseHandle is specified, and this function succeeds, | - | ||||||||||||
980 | then calling close() closes the adopted handle. | - | ||||||||||||
981 | Otherwise, close() does not actually close the file, but only flushes it. | - | ||||||||||||
982 | - | |||||||||||||
983 | The QFile that is opened using this function is automatically set | - | ||||||||||||
984 | to be in raw mode; this means that the file input/output functions | - | ||||||||||||
985 | are slow. If you run into performance issues, you should try to | - | ||||||||||||
986 | use one of the other open functions. | - | ||||||||||||
987 | - | |||||||||||||
988 | \warning If \a fd is not a regular file, e.g, it is 0 (\c stdin), | - | ||||||||||||
989 | 1 (\c stdout), or 2 (\c stderr), you may not be able to seek(). In | - | ||||||||||||
990 | those cases, size() returns \c 0. See QIODevice::isSequential() | - | ||||||||||||
991 | for more information. | - | ||||||||||||
992 | - | |||||||||||||
993 | \warning Since this function opens the file without specifying the file name, | - | ||||||||||||
994 | you cannot use this QFile with a QFileInfo. | - | ||||||||||||
995 | - | |||||||||||||
996 | \sa close() | - | ||||||||||||
997 | */ | - | ||||||||||||
998 | bool QFile::open(int fd, OpenMode mode, FileHandleFlags handleFlags) | - | ||||||||||||
999 | { | - | ||||||||||||
1000 | Q_D(QFile); | - | ||||||||||||
1001 | if (isOpen()) {
| 0-29 | ||||||||||||
1002 | qWarning("QFile::open: File (%s) already open", qPrintable(fileName())); | - | ||||||||||||
1003 | return false; never executed: return false; | 0 | ||||||||||||
1004 | } | - | ||||||||||||
1005 | if (mode & Append)
| 0-29 | ||||||||||||
1006 | mode |= WriteOnly; never executed: mode |= WriteOnly; | 0 | ||||||||||||
1007 | unsetError(); | - | ||||||||||||
1008 | if ((mode & (ReadOnly | WriteOnly)) == 0) {
| 0-29 | ||||||||||||
1009 | qWarning("QFile::open: File access not specified"); | - | ||||||||||||
1010 | return false; never executed: return false; | 0 | ||||||||||||
1011 | } | - | ||||||||||||
1012 | if (d->openExternalFile(mode, fd, handleFlags)) {
| 0-29 | ||||||||||||
1013 | QIODevice::open(mode); | - | ||||||||||||
1014 | if (!(mode & Append) && !isSequential()) {
| 0-29 | ||||||||||||
1015 | qint64 pos = (qint64)QT_LSEEK(fd, QT_OFF_T(0), SEEK_CUR); | - | ||||||||||||
1016 | if (pos != -1) {
| 0-24 | ||||||||||||
1017 | // Skip redundant checks in QFileDevice::seek(). | - | ||||||||||||
1018 | QIODevice::seek(pos); | - | ||||||||||||
1019 | } executed 24 times by 2 tests: end of block Executed by:
| 24 | ||||||||||||
1020 | } executed 24 times by 2 tests: end of block Executed by:
| 24 | ||||||||||||
1021 | return true; executed 29 times by 3 tests: return true; Executed by:
| 29 | ||||||||||||
1022 | } | - | ||||||||||||
1023 | return false; never executed: return false; | 0 | ||||||||||||
1024 | } | - | ||||||||||||
1025 | - | |||||||||||||
1026 | /*! | - | ||||||||||||
1027 | \reimp | - | ||||||||||||
1028 | */ | - | ||||||||||||
1029 | bool QFile::resize(qint64 sz) | - | ||||||||||||
1030 | { | - | ||||||||||||
1031 | return QFileDevice::resize(sz); // for now executed 295 times by 7 tests: return QFileDevice::resize(sz); Executed by:
| 295 | ||||||||||||
1032 | } | - | ||||||||||||
1033 | - | |||||||||||||
1034 | /*! | - | ||||||||||||
1035 | \overload | - | ||||||||||||
1036 | - | |||||||||||||
1037 | Sets \a fileName to size (in bytes) \a sz. Returns \c true if the file if | - | ||||||||||||
1038 | the resize succeeds; false otherwise. If \a sz is larger than \a | - | ||||||||||||
1039 | fileName currently is the new bytes will be set to 0, if \a sz is | - | ||||||||||||
1040 | smaller the file is simply truncated. | - | ||||||||||||
1041 | - | |||||||||||||
1042 | \sa resize() | - | ||||||||||||
1043 | */ | - | ||||||||||||
1044 | - | |||||||||||||
1045 | bool | - | ||||||||||||
1046 | QFile::resize(const QString &fileName, qint64 sz) | - | ||||||||||||
1047 | { | - | ||||||||||||
1048 | return QFile(fileName).resize(sz); executed 3 times by 1 test: return QFile(fileName).resize(sz); Executed by:
| 3 | ||||||||||||
1049 | } | - | ||||||||||||
1050 | - | |||||||||||||
1051 | /*! | - | ||||||||||||
1052 | \reimp | - | ||||||||||||
1053 | */ | - | ||||||||||||
1054 | QFile::Permissions QFile::permissions() const | - | ||||||||||||
1055 | { | - | ||||||||||||
1056 | return QFileDevice::permissions(); // for now executed 200 times by 12 tests: return QFileDevice::permissions(); Executed by:
| 200 | ||||||||||||
1057 | } | - | ||||||||||||
1058 | - | |||||||||||||
1059 | /*! | - | ||||||||||||
1060 | \overload | - | ||||||||||||
1061 | - | |||||||||||||
1062 | Returns the complete OR-ed together combination of | - | ||||||||||||
1063 | QFile::Permission for \a fileName. | - | ||||||||||||
1064 | */ | - | ||||||||||||
1065 | - | |||||||||||||
1066 | QFile::Permissions | - | ||||||||||||
1067 | QFile::permissions(const QString &fileName) | - | ||||||||||||
1068 | { | - | ||||||||||||
1069 | return QFile(fileName).permissions(); executed 11 times by 3 tests: return QFile(fileName).permissions(); Executed by:
| 11 | ||||||||||||
1070 | } | - | ||||||||||||
1071 | - | |||||||||||||
1072 | /*! | - | ||||||||||||
1073 | Sets the permissions for the file to the \a permissions specified. | - | ||||||||||||
1074 | Returns \c true if successful, or \c false if the permissions cannot be | - | ||||||||||||
1075 | modified. | - | ||||||||||||
1076 | - | |||||||||||||
1077 | \warning This function does not manipulate ACLs, which may limit its | - | ||||||||||||
1078 | effectiveness. | - | ||||||||||||
1079 | - | |||||||||||||
1080 | \sa permissions(), setFileName() | - | ||||||||||||
1081 | */ | - | ||||||||||||
1082 | - | |||||||||||||
1083 | bool QFile::setPermissions(Permissions permissions) | - | ||||||||||||
1084 | { | - | ||||||||||||
1085 | return QFileDevice::setPermissions(permissions); // for now executed 622 times by 17 tests: return QFileDevice::setPermissions(permissions); Executed by:
| 622 | ||||||||||||
1086 | } | - | ||||||||||||
1087 | - | |||||||||||||
1088 | /*! | - | ||||||||||||
1089 | \overload | - | ||||||||||||
1090 | - | |||||||||||||
1091 | Sets the permissions for \a fileName file to \a permissions. | - | ||||||||||||
1092 | */ | - | ||||||||||||
1093 | - | |||||||||||||
1094 | bool | - | ||||||||||||
1095 | QFile::setPermissions(const QString &fileName, Permissions permissions) | - | ||||||||||||
1096 | { | - | ||||||||||||
1097 | return QFile(fileName).setPermissions(permissions); executed 159 times by 6 tests: return QFile(fileName).setPermissions(permissions); Executed by:
| 159 | ||||||||||||
1098 | } | - | ||||||||||||
1099 | - | |||||||||||||
1100 | /*! | - | ||||||||||||
1101 | \reimp | - | ||||||||||||
1102 | */ | - | ||||||||||||
1103 | qint64 QFile::size() const | - | ||||||||||||
1104 | { | - | ||||||||||||
1105 | return QFileDevice::size(); // for now executed 165638 times by 164 tests: return QFileDevice::size(); Executed by:
| 165638 | ||||||||||||
1106 | } | - | ||||||||||||
1107 | - | |||||||||||||
1108 | QT_END_NAMESPACE | - | ||||||||||||
Source code | Switch to Preprocessed file |