diff --git a/java/java-tests/testSrc/com/intellij/openapi/vfs/LocalFileSystemTest.java b/java/java-tests/testSrc/com/intellij/openapi/vfs/LocalFileSystemTest.java index 873da529c22b..cef6c65b073b 100644 --- a/java/java-tests/testSrc/com/intellij/openapi/vfs/LocalFileSystemTest.java +++ b/java/java-tests/testSrc/com/intellij/openapi/vfs/LocalFileSystemTest.java @@ -6,9 +6,11 @@ import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.registry.Registry; import com.intellij.openapi.vfs.impl.win32.Win32LocalFileSystem; import com.intellij.openapi.vfs.newvfs.ManagingFS; +import com.intellij.openapi.vfs.newvfs.persistent.PersistentFS; import com.intellij.testFramework.IdeaTestCase; import com.intellij.testFramework.IdeaTestUtil; import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.Nullable; import java.io.File; import java.io.FileOutputStream; @@ -22,13 +24,15 @@ public class LocalFileSystemTest extends IdeaTestCase{ public static void setContentOnDisk(File file, byte[] bom, String content, Charset charset) throws IOException { FileOutputStream stream = new FileOutputStream(file); - stream.write(bom); + if (bom != null) { + stream.write(bom); + } OutputStreamWriter writer = new OutputStreamWriter(stream, charset); writer.write(content); writer.close(); } - public static VirtualFile createTempFile(@NonNls String ext, byte[] bom, @NonNls String content, Charset charset) throws IOException { + public static VirtualFile createTempFile(@NonNls String ext, @Nullable byte[] bom, @NonNls String content, Charset charset) throws IOException { File temp = FileUtil.createTempFile("copy", "." + ext); setContentOnDisk(temp, bom, content, charset); @@ -257,4 +261,21 @@ public class LocalFileSystemTest extends IdeaTestCase{ VirtualFile root = LocalFileSystem.getInstance().findFileByPath(""); assertNotNull(root); } + + public void testFileLength() throws Exception { + + File file = FileUtil.createTempFile("test", "txt"); + FileUtil.writeToFile(file, "hello"); + VirtualFile virtualFile = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(file); + assertNotNull(virtualFile); + String s = VfsUtil.loadText(virtualFile); + assertEquals("hello", s); + assertEquals(5, virtualFile.getLength()); + + FileUtil.writeToFile(file, "new content"); + ((PersistentFS)ManagingFS.getInstance()).cleanPersistedContents(); + s = VfsUtil.loadText(virtualFile); + assertEquals("new content", s); + assertEquals(11, virtualFile.getLength()); + } } diff --git a/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/persistent/PersistentFS.java b/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/persistent/PersistentFS.java index cfc1dd1b2baf..f4acb1b111d7 100644 --- a/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/persistent/PersistentFS.java +++ b/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/persistent/PersistentFS.java @@ -460,6 +460,7 @@ public class PersistentFS extends ManagingFS implements ApplicationComponent { if (reloadFromDelegate) { final NewVirtualFileSystem delegate = getDelegate(file); + FSRecords.setLength(getFileId(file), delegate.getLength(file)); final byte[] content = delegate.contentsToByteArray(file); ApplicationEx application = (ApplicationEx)ApplicationManager.getApplication(); @@ -469,8 +470,6 @@ public class PersistentFS extends ManagingFS implements ApplicationComponent { content.length <= FILE_LENGTH_TO_CACHE_THRESHOLD) { synchronized (INPUT_LOCK) { writeContent(file, new ByteSequence(content), delegate.isReadOnly()); - - FSRecords.setLength(getFileId(file), content.length); setFlag(file, MUST_RELOAD_CONTENT, false); } } @@ -498,6 +497,7 @@ public class PersistentFS extends ManagingFS implements ApplicationComponent { if (mustReloadContent(file) || (contentStream = readContent(file)) == null) { final NewVirtualFileSystem delegate = getDelegate(file); final long len = delegate.getLength(file); + FSRecords.setLength(getFileId(file), len); final InputStream nativeStream = delegate.getInputStream(file); if (len > FILE_LENGTH_TO_CACHE_THRESHOLD) return nativeStream; @@ -519,7 +519,6 @@ public class PersistentFS extends ManagingFS implements ApplicationComponent { synchronized (INPUT_LOCK) { if (getBytesRead() == len) { writeContent(file, new ByteSequence(cache.getInternalBuffer(), 0, cache.size()), readOnly); - FSRecords.setLength(getFileId(file), len); setFlag(file, MUST_RELOAD_CONTENT, false); } else { diff --git a/platform/testFramework/src/com/intellij/openapi/application/ex/PathManagerEx.java b/platform/testFramework/src/com/intellij/openapi/application/ex/PathManagerEx.java index 02654af4ea93..47731aae9e37 100644 --- a/platform/testFramework/src/com/intellij/openapi/application/ex/PathManagerEx.java +++ b/platform/testFramework/src/com/intellij/openapi/application/ex/PathManagerEx.java @@ -142,6 +142,10 @@ public class PathManagerEx { return getTestDataPath(strategy); } + public static String getTestDataPath(String path) throws IllegalStateException { + return getTestDataPath() + path.replace('/', File.separatorChar); + } + /** * Shorthand for calling {@link #getTestDataPath(TestDataLookupStrategy)} with strategy obtained via call to * {@link #determineLookupStrategy(Class)} with the given class.