kde-workspace/kioslave/trash/discspaceutil.cpp
2014-11-15 04:16:00 +02:00

93 lines
2.5 KiB
C++

/*
This file is part of the KDE project
Copyright (C) 2008 Tobias Koenig <tokoe@kde.org>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
*/
#include "discspaceutil.h"
#include <QtCore/QDirIterator>
#include <QtCore/QFileInfo>
#include <kdiskfreespaceinfo.h>
#include <kdebug.h>
#include <kde_file.h>
DiscSpaceUtil::DiscSpaceUtil( const QString &directory )
: mDirectory( directory ),
mFullSize( 0 )
{
calculateFullSize();
}
qulonglong DiscSpaceUtil::sizeOfPath( const QString &path )
{
QFileInfo info( path );
if ( !info.exists() ) {
return 0;
}
if ( info.isSymLink() ) {
// QFileInfo::size does not return the actual size of a symlink. #253776
KDE_struct_stat buff;
return static_cast<qulonglong>(KDE::lstat(path, &buff) == 0 ? buff.st_size : 0);
} else if ( info.isFile() ) {
return info.size();
} else if ( info.isDir() ) {
QDirIterator it( path, QDirIterator::NoIteratorFlags );
qulonglong sum = 0;
while ( it.hasNext() ) {
const QFileInfo info = it.next();
if (info.fileName() != QLatin1String(".") && info.fileName() != QLatin1String(".."))
sum += sizeOfPath( info.absoluteFilePath() );
}
return sum;
} else {
return 0;
}
}
double DiscSpaceUtil::usage( qulonglong size ) const
{
if ( mFullSize == 0 )
return 0;
return (((double)size*100)/(double)mFullSize);
}
qulonglong DiscSpaceUtil::size() const
{
return mFullSize;
}
QString DiscSpaceUtil::mountPoint() const
{
return mMountPoint;
}
void DiscSpaceUtil::calculateFullSize()
{
KDiskFreeSpaceInfo info = KDiskFreeSpaceInfo::freeSpaceInfo( mDirectory );
if ( info.isValid() ) {
mFullSize = info.size();
mMountPoint = info.mountPoint();
}
}