+2004-07-17 Mark Wielaard <mark@klomp.org>
+
+ * gnu/java/nio/channels/FileChannelImpl.java (truncate): Only truncate
+ when size is smaller.
+ * java/io/RandomAccessFile.java (setLength): Use truncate for
+ shrinking the file and seek plus write for expanding the file.
+
+2004-07-17 Michael Koch <konqueror@gmx.de>
+
+ * gnu/java/nio/channels/natFileChannelPosix.cc
+ (implTruncate): Always save current position. Only reposition file
+ pointer to where we started if not beyond new lenght. Reposition file
+ pointer to file length if it points beyond the end of file.
+
2004-07-17 Mark Wielaard <mark@klomp.org>
* javax/swing/Box.java: Put FIXME comment above class declaration.
}
else
{
- if (::ftruncate (fd, (off_t) pos))
+ if (::ftruncate (fd, (off_t) size))
+ throw new IOException (JvNewStringLatin1 (strerror (errno)));
+ if (pos > size
+ && ::lseek (fd, (off_t) size, SEEK_SET) == -1)
throw new IOException (JvNewStringLatin1 (strerror (errno)));
pos = size;
}
}
/**
- * This method sets the length of the file to the specified length. If
- * the currently length of the file is longer than the specified length,
- * then the file is truncated to the specified length. If the current
- * length of the file is shorter than the specified length, the file
- * is extended with bytes of an undefined value.
- * <p>
+ * This method sets the length of the file to the specified length.
+ * If the currently length of the file is longer than the specified
+ * length, then the file is truncated to the specified length (the
+ * file position is set to the end of file in this case). If the
+ * current length of the file is shorter than the specified length,
+ * the file is extended with bytes of an undefined value (the file
+ * position is unchanged in this case).
+ * <p>
* The file must be open for write access for this operation to succeed.
*
* @param newlen The new length of the file
*/
public void setLength (long newLen) throws IOException
{
- ch.truncate (newLen);
+ // FIXME: Extending a file should probably be done by one method call.
+
+ // FileChannel.truncate() can only shrink a file.
+ // To expand it we need to seek forward and write at least one byte.
+ if (newLen < length())
+ ch.truncate (newLen);
+ else if (newLen > length())
+ {
+ long pos = getFilePointer();
+ seek(newLen - 1);
+ write(0);
+ seek(pos);
+ }
}
/**