22 #include <sys/types.h>
24 #ifdef HAVE_SYS_STAT_H
35 #include <tqdatetime.h>
39 #include "tdeapplication.h"
40 #include "ksavefile.h"
41 #include "kstandarddirs.h"
52 if (!checkAccess(real_filename, W_OK))
54 mTempFile.setError(EACCES);
58 if (mTempFile.create(real_filename, TQString::fromLatin1(
".new"), mode))
60 mFileName = real_filename;
65 KDE_struct_stat stat_buf;
66 if (KDE_stat(TQFile::encodeName(real_filename), &stat_buf)==0)
69 if (stat_buf.st_uid == getuid())
71 bool changePermission =
true;
72 if (stat_buf.st_gid != getgid())
74 if (fchown(mTempFile.
handle(), (uid_t) -1, stat_buf.st_gid) != 0)
77 changePermission =
false;
81 fchmod(mTempFile.
handle(), stat_buf.st_mode);
109 if (mTempFile.
name().isEmpty() || mTempFile.
handle()==-1)
111 if (!mTempFile.
sync())
116 if (mTempFile.
close())
118 if (0==KDE_rename(TQFile::encodeName(mTempFile.
name()), TQFile::encodeName(mFileName)))
120 mTempFile.setError(errno);
128 write_all(
int fd,
const char *buf,
size_t len)
132 int written = write(fd, buf, len);
146 const TQString& backupExtension)
148 TQCString cFilename = TQFile::encodeName(qFilename);
149 const char *filename = cFilename.data();
151 int fd = KDE_open( filename, O_RDONLY );
155 KDE_struct_stat buff;
156 if ( KDE_fstat( fd, &buff) < 0 )
163 if ( backupDir.isEmpty() )
168 int slash = cFilename.findRev(
'/');
170 nameOnly = cFilename;
172 nameOnly = cFilename.mid(slash + 1);
173 cBackup = TQFile::encodeName(backupDir);
174 if ( backupDir[backupDir.length()-1] != (QChar)
'/' )
178 cBackup += TQFile::encodeName(backupExtension);
179 const char *backup = cBackup.data();
180 int permissions = buff.st_mode & 07777;
182 if ( KDE_stat( backup, &buff) == 0)
184 if ( unlink( backup ) != 0 )
191 mode_t old_umask = umask(0);
192 int fd2 = KDE_open( backup, O_WRONLY | O_CREAT | O_EXCL, permissions | S_IWUSR);
201 char buffer[ 32*1024 ];
205 int n = ::read( fd, buffer, 32*1024 );
217 if (write_all( fd2, buffer, n))
~KSaveFile()
The destructor closes the file.
void abort()
Aborts the write operation and removes any intermediate files This implies a close.
bool close()
Closes the file and makes the changes definitive.
bool sync()
Flushes file to disk (fsync).
static TQString realFilePath(const TQString &filename)
Expands all symbolic links and resolves references to '/.
int handle() const
An integer file descriptor open for writing to the file.
TQString name() const
Returns the full path and name of the file.
KSaveFile(const TQString &filename, int mode=0666)
Creates a new KSaveFile with the given file name.
void unlink()
Unlinks the file from the directory.
bool close()
Closes the file.
TQString name() const
The name of the file as passed to the constructor.
static bool backupFile(const TQString &filename, const TQString &backupDir=TQString::null, const TQString &backupExtension=TQString::fromLatin1("~"))
Static method to create a backup file before saving.