reliability: make parent dirs before attempting to create output file (EA-90703,...
authorMaxim.Mossienko <Maxim.Mossienko@jetbrains.com>
Fri, 11 Nov 2016 16:02:48 +0000 (17:02 +0100)
committerMaxim.Mossienko <Maxim.Mossienko@jetbrains.com>
Fri, 11 Nov 2016 16:04:46 +0000 (17:04 +0100)
platform/util/src/com/intellij/util/io/ReadWriteDirectBufferWrapper.java
platform/util/src/com/intellij/util/io/ResizeableMappedFile.java

index 99797b266acdd57fe0c022be5f0a4e27eadd0f83..59f5095a704686f33943f255bfaa35f8d1849c38 100644 (file)
@@ -57,6 +57,8 @@ public class ReadWriteDirectBufferWrapper extends DirectBufferWrapper {
     final RandomAccessFile myFile;
 
     FileContext(final File file) throws IOException {
+      final File parentFile = file.getParentFile();
+      if (!parentFile.exists()) parentFile.mkdirs();
       myFile = FileUtilRt.doIOOperation(new FileUtilRt.RepeatableIOOperation<RandomAccessFile, IOException>() {
         @Nullable
         @Override
@@ -64,8 +66,8 @@ public class ReadWriteDirectBufferWrapper extends DirectBufferWrapper {
           try {
             return new RandomAccessFile(file, RW);
           } catch (FileNotFoundException ex) {
-            if (!file.getParentFile().exists()) {
-              throw new IOException("Parent file doesn't exist:" + file);
+            if (!parentFile.exists()) {
+              throw new IOException("Parent file still doesn't exist:" + file);
             }
             if (!finalAttempt) return null;
             throw ex;
index a30e7f57e7c050385ebd708c6999d0c2abdc5b42..4167728a22c915c899b6360d580d679c26825027 100644 (file)
@@ -125,6 +125,8 @@ public class ResizeableMappedFile implements Forceable {
     final File lengthFile = getLengthFile();
     DataOutputStream stream = null;
     try {
+      File parentFile = lengthFile.getParentFile();
+      if (!parentFile.exists()) parentFile.mkdirs();
       stream = FileUtilRt.doIOOperation(new FileUtilRt.RepeatableIOOperation<DataOutputStream, IOException>() {
         @Nullable
         @Override
@@ -133,7 +135,7 @@ public class ResizeableMappedFile implements Forceable {
             return new DataOutputStream(new FileOutputStream(lengthFile));
           } catch (FileNotFoundException ex) {
             if (!lengthFile.getParentFile().exists()) {
-              throw new IOException("Parent file doesn't exist:" + lengthFile);
+              throw new IOException("Parent file still doesn't exist:" + lengthFile);
             }
             if (!lastAttempt) return null;
             throw ex;