[Interest] Strange undeletable QTemporaryFile. Is it a bug?
Thiago Macieira
thiago.macieira at intel.com
Wed Aug 28 03:51:53 CEST 2013
On terça-feira, 27 de agosto de 2013 16:55:44, Alex Malyushytskyy wrote:
> QIODevice::close() - closes the device
>
> when
>
> QTemporaryFile::close() truncates and repositions, but doesn't *close* the
> file. If you really want to close, destroy the object or force it to open a
> new
> file (with a new name).
QTemporaryFile::close() calls QIODevice::close(), so it does what any
QIODevice is expected to do.
> According to above, example below does not make sense
> cause you can't delete file after call to bar(). .
> Relying on interface is already broken.
>
> > void bar (QIODevice& zzz)
> > {
> >
> > // ...
> > zzz.close(); // Oops
> > }
You couldn't delete in bar() anyway because you don't know if this is a file or
not. It could be a QProcess.
Now, assuming you have a QFile above instead of QIODevice, you still can't be
assured that you can delete, because:
a) the directory could not be writable by you
b) the file could be locked by another process
c) the file is in a read-only filesystem, including virtual filesystems (e.g.,
the resources filesystem)
The way I see it, you have a problem in your design. So I will agree with you
when you say "example below does not make sense". It doesn't. It's not a good
design.
Since QTemporaryFile auto-deletes, you shouldn't call a function that tries to
delete it. You should only call that function if you know you opened a QFile
and that it should be deleted.
> The whole problem is that QTemporaryFile::close() does not do what it is
> supposed to do.
I disagree. It does exactly what it's supposed to do.
You meant to say: "QTemporaryFile::close() does not do what I expected it to
do"
Note: QTemporaryFile::close() is QFile::close(). The difference is in the file
engine.
> And I see only 2 ways to fix it:
>
> 1. Change the interface so user can't call function which is source of the
> problem.
> 2. Change implementation so close works as expected.
Since I disagree that it is a problem to begin with, I disagree that there
needs to be a "fix". So for me, we have option 3: do nothing.
> >> The only way to make it work would be for close() to unset the fileName()
>
> again. When open() is called again, it creates a new file name based on the
> template.
That would be fine.
Except that people expect fileName() to return something non-empty after
close().
> >> Which is exactly what you don't want.
>
> I might be missing something , but I would can't see why not.
>
> If you say that lifetime of the temporary file (including name) is limited
> by opening and closing
> I do not see any security issues.
> It is also what I would expect temporary file to do by default.
To be honest, it's what I would have preferred.
However, people expect to have access to the file name after close().
Therefore, we can't release (delete) the file at close() time.
Anyway, this behaviour is now too ingrained in Qt. It's unlikely to ever
change.
--
Thiago Macieira - thiago.macieira (AT) intel.com
Software Architect - Intel Open Source Technology Center
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 190 bytes
Desc: This is a digitally signed message part.
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20130827/e95976b5/attachment.sig>
More information about the Interest
mailing list