Доступ к файлу с помощью внешней программы сразу после закрытия потока. (C ++) - PullRequest
0 голосов
/ 08 мая 2020

Итак, у меня странная проблема, когда я пытаюсь записать файл, а затем быстро запустить на нем внешнюю программу (в данном случае компилятор java). Кажется, есть задержка между тем, когда я закрываю поток, и когда внешняя программа может увидеть файл в файловой системе. Если я запускаю программу сразу после закрытия файла, она выдаёт ошибку, утверждая, что не может найти только что написанный мной файл. Однако, если я использую std :: filesystem :: exists (), мне кажется, что он существует.

Сначала я подумал просто busy-l oop это с некоторым сном, однако, поскольку std :: filesystem :: exists () сообщает, что файл на самом деле существует, у меня, похоже, нет возможности проверки, сможет ли внешняя программа прочитать его перед выполнением. Так что я понятия не имею, как долго я буду занят l oop, если бы я пошел по этому маршруту, и я бы предпочел не иметь 5-10 секундных задержек, если это возможно.

Мое чутье говорит, что это зависит от платформы, так как я имею дело со временем отклика файловой системы, но я также сталкивался с аналогичными проблемами ранее в этом проекте, когда я попытаюсь удалить файл очень скоро после его написания, а затем появляется сообщение об ошибке «этот файл используется другой программой et c ...». И да, я закрываю все свои офстримы, прежде чем попробовать это.

Я также знаю, что это зависит от времени, так как, если я установлю точку останова программы прямо перед вызовом компилятора Java, а затем подожду примерно 10 секунд перед возобновлением, все будет работать, как ожидалось, но ненадежно. Я использую Windows, использую C ++ 2a. Я бы предпочел кроссплатформенное решение (если это даже проблема на Linux), однако я готов реализовать его отдельно для Windows и Linux, если это абсолютно необходимо. Я совершенно не понимаю, где продолжить отладку ...

Код

//Create Source File
//Ex... %Temp%/4j783jy7f3jy879/source.java
auto sourceFileName = temp / "source.java"; 
std::ofstream sourceFile(sourceFileName);
sourceFile << source;
sourceFile.close();

//Compile File
//This is not throwing, so this thinks its there...
if (!std::filesystem::exists(sourceFileName)) throw "I can't see the file"; 

//If I smack a breakpoint here and go to the temp folder, source.java definitley exist
//If I then wait like 5-10 seconds before resuming it works sometimes......

// Essentially runs "javac.exe source.java"
// Will probably fail due to not finding the file
secsystem(javacLoc, { sourceFileName.string() }); 

Ошибка

E:/3rd_party/lib/jdk-14.0.1/bin/javac.exe C:\Users\Mike\AppData\Local\Temp\3BHJLOQRWX\source.java
error: file not found: C:\Users\Mike\AppData\Local\Temp\3BHJLOQRWX\source.java
Usage: javac <options> <source files>
use --help for a list of possible options

Источник

Если это применимо вот источник этого фрагмента: JavaBlock. cpp

Кроме того, я чувствую, что некоторые спросят, вот источник secsystem (): SecureSystem. cpp

...