You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Gary D. Gregory (Jira)" <ji...@apache.org> on 2022/05/31 14:33:00 UTC

[jira] [Commented] (VFS-820) FileObject.copyFrom leaves extra bytes when copying from a smaller file

    [ https://issues.apache.org/jira/browse/VFS-820?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17544424#comment-17544424 ] 

Gary D. Gregory commented on VFS-820:
-------------------------------------

Hello [~agoubard] 

I think commit {{34efda6b7c932d671012e5ff11c58e1ddd17a95d}} fixed the issue. Would you test 2.10-SNAPSHOT from https://repository.apache.org/content/repositories/snapshots/org/apache/commons/ ?


> FileObject.copyFrom leaves extra bytes when copying from a smaller file
> -----------------------------------------------------------------------
>
>                 Key: VFS-820
>                 URL: https://issues.apache.org/jira/browse/VFS-820
>             Project: Commons VFS
>          Issue Type: Bug
>    Affects Versions: 2.9.0
>         Environment: Tested on Windows 10
>            Reporter: Anthony Goubard
>            Priority: Major
>
> If you copy a file using the _FileObject.copyFrom_ method and the destination file is larger than the source file, the destination will contain the bytes of the source file and the remaining bytes of the destination (See example).
>  
> {code:java}
> import java.io.File;
> import java.io.IOException;
> import java.nio.charset.StandardCharsets;
> import java.nio.file.Files;
> import org.apache.commons.vfs2.FileObject;
> import org.apache.commons.vfs2.Selectors;
> import org.apache.commons.vfs2.VFS;
> public class BugCopyToLargerFile {
>     private static final String LARGE_TEXT = "This is a larger text.\nTo show that the extra bytes are remining after a copy of a small file";
>     private static final String SHORT_TEXT = "This is a short text.";
>     public static final void main(String args[]) throws IOException {
>         File largeFile = new File(System.getProperty("java.io.tmpdir"), "large.txt");
>         File shortFile = new File(System.getProperty("java.io.tmpdir"), "short.txt");
>         FileObject largeFileObject = VFS.getManager().toFileObject(largeFile);
>         Files.writeString(largeFile.toPath(), LARGE_TEXT, StandardCharsets.UTF_8);
>         FileObject shortFileObject = VFS.getManager().toFileObject(shortFile);
>         Files.writeString(shortFile.toPath(), SHORT_TEXT, StandardCharsets.UTF_8);
>         checkFileContent(shortFile, SHORT_TEXT);
>         checkFileContent(largeFile, LARGE_TEXT);
>         largeFileObject.copyFrom(shortFileObject, Selectors.SELECT_ALL);
>         checkFileContent(largeFile, SHORT_TEXT);
>     }    
>     private static void checkFileContent(File file, String content) throws IOException {
>         String fileContent = Files.readString(file.toPath(), StandardCharsets.UTF_8);
>         if (fileContent.equals(content)) {
>             System.out.println(file.getName() + " correct");
>         } else {
>             System.out.println(file.getName() + " incorrect content: " + fileContent);
>         }
>     }
> }
>  {code}
> {noformat}
> short.txt correct
> large.txt correct
> large.txt incorrect content: This is a short text..
> To show that the extra bytes are remining after a copy of a small file
> {noformat}
> Note that the javadoc of copyFrom contains "If this file does exist, it is deleted first." but it doesn't happen in the code.
> One solution would be to delete the file like in _FileObject.moveTo_ method
> {code:java}
>         if (exists() && !isSameFile(file)) {
>               deleteSelf();
>         }
> {code}
> But I think that the problem is in the _DefaultFileContent.write_ methods



--
This message was sent by Atlassian Jira
(v8.20.7#820007)