25 #include <sys/types.h>
27 #ifdef HAVE_SYS_STAT_H
44 #include <QtCore/QDir>
54 #include <QtCore/QVarLengthArray>
64 class KTempDir::Private
90 const QString nme = directoryPrefix + QLatin1String(
"XXXXXX");
92 if(realName.isEmpty())
94 kWarning(180) <<
"KTempDir: Error trying to create " << nme
95 <<
": " << ::strerror(errno) << endl;
102 d->tmpName = realName + QLatin1Char(
'/');
103 kDebug(180) <<
"KTempDir: Temporary directory created :" << d->tmpName
111 QByteArray nme = QFile::encodeName(directoryPrefix) +
"XXXXXX";
113 if((realName=mkdtemp(nme.data())) == 0)
116 nme = QFile::encodeName(directoryPrefix) +
"XXXXXX";
117 kWarning(180) <<
"KTempDir: Error trying to create " << nme.data()
118 <<
": " << ::strerror(errno) << endl;
125 QByteArray realNameStr(realName);
126 d->tmpName = QFile::decodeName(realNameStr)+QLatin1Char(
'/');
127 kDebug(180) <<
"KTempDir: Temporary directory created :" << d->tmpName
131 if(
chmod(nme, mode&(~umsk)) < 0) {
132 kWarning(180) <<
"KTempDir: Unable to change permissions on" << d->tmpName
133 <<
":" << ::strerror(errno);
136 (void) ::rmdir(realName);
144 if(chown(nme, getuid(), getgid()) < 0) {
146 kWarning(180) <<
"KTempDir: Unable to change owner on" << d->tmpName
147 <<
":" << ::strerror(errno);
185 return d->autoRemove;
190 if (!d->exists)
return;
200 static bool rmtree(
const QByteArray& name)
204 if ( KDE_lstat( name.data(), &st ) == -1 )
206 if ( S_ISDIR( st.st_mode ) )
210 KDE_struct_dirent* ep;
211 DIR* dp = ::opendir( name.data() );
214 while ( ( ep = KDE_readdir( dp ) ) )
217 if ( !qstrcmp( ep->d_name,
"." ) || !qstrcmp( ep->d_name,
".." ) )
219 QByteArray newName( name );
221 newName += ep->d_name;
230 if ( ::closedir( dp ) ) {
231 kDebug(180) <<
"Error closing" << name;
236 if ( ! rmtree( newName ) )
239 dp = ::opendir( name.data() );
243 if ( ::closedir( dp ) ) {
244 kDebug(180) <<
"Error closing" << name;
248 return ! ::rmdir( name );
254 return ! ::unlink( name );
262 if ( !QFile::exists( path ) )
266 QVarLengthArray<WCHAR, MAX_PATH>
name;
267 name.resize( path.length() + 2 );
268 memcpy( name.data(), path.utf16(), path.length() *
sizeof(WCHAR) );
269 name[path.length() ] = 0;
270 name[path.length() + 1 ] = 0;
271 if(path.endsWith(QLatin1Char(
'/')) || path.endsWith(QLatin1Char(
'\\')))
272 name[path.length() - 1 ] = 0;
273 SHFILEOPSTRUCTW fileOp;
274 memset(&fileOp, 0,
sizeof(SHFILEOPSTRUCTW) );
275 fileOp.wFunc = FO_DELETE;
276 fileOp.pFrom = (LPCWSTR)name.constData();
277 fileOp.fFlags = FOF_NOCONFIRMATION | FOF_SILENT;
281 fileOp.fFlags |= FOF_NOERRORUI;
283 errno = SHFileOperationW( &fileOp );
286 const QByteArray cstr( QFile::encodeName( path ) );
287 return rmtree( cstr );