Я создал программы на C ++, в задачу которых входит резервное копирование и восстановление базы данных в MySQL. Эти программы на C ++ используют две папки, а именно: readerCode
а также saves
, readerCode
содержит текстовые файлы (или сценарии), которые содержат команду в MySQL. saves
папка, в которой хранится резервная копия. Я сохранил программы и папки в C:\AwesomeDatabase\ext
,
Когда я запускаю программы через cmd, команда запускается успешно. Он создает файл .sql в папке сохранения. Но когда я запускаю его через свою Java-программу с помощью компоновщика процессов, java-программа может запускать исполняемые программы (для резервного копирования и восстановления), но программы C ++ не могут найти файл, который нужно найти. Заранее спасибо!
Фрагмент кода из Process.java
private void menuItemBackupActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
try {
String cmd [] = {"\"C:\\AwesomeDatabase\\ext\\DBBackup.exe\"", "-d"};
ProcessBuilder builder = new ProcessBuilder ("\"C:\\AwesomeDatabase\\ext\\DBBackup.exe\"", "-d");
builder.redirectErrorStream (true);
Process p = builder.start();
java.io.BufferedReader r = new java.io.BufferedReader(new java.io.InputStreamReader(p.getInputStream()));
String line;
while (true) {
line = r.readLine();
if (line == null) { break; }
System.out.println(line);
}
} catch (java.io.IOException ioe) {
System.err.println ("Fatal Error! Back up file not found!\n" + ioe);
}
}
Да, так Java начнет процесс, когда menuItemBackup
нажата. Так вот мой DBBackup.cpp
#include <iostream>
#include <cstdlib>
#include <cstring>
#include "backup_head.h"
using namespace std;
//void secureBackup (void);
void normalBackup (void);
int
main (int argc, char *argv[])
{
if (argc > 1) {
if (strcmp (argv [1], "-s") == false) {
//secureBackup();
} else if (strcmp (argv [1], "-d") == false) {
normalBackup();
} else {
cout << "Invalid Command Line Arguments!" << endl;
Sleep (500);
}
} else {
cout << "Invalid Process Spawn!" << endl;
Sleep (500);
}
return (0);
}
void
normalBackup (void)
{
/* Fetch Location Variables */
Program_Path progpath = "";
Change_Directory cd = "CD";
/* Back Up Variables */
Program_Name progdump = "mysqldump";
Database_Name dbname = "sampledb";
Directory_Name dirName = "saves";
Dump_Name dumpName = "BackUpNow";
Username username = "root";
Password password = "root";
/* Delete Old Back Up */
Command delCommand = "DEL";
File_Name file = "DBBackUp";
File_Directory fileDir = "saves";
/* Commands */
_getcwd (progpath, sizeof (progpath));
_chdir (progpath);
SetCurrentDirectory (progpath);
Command redir = cd + " " + "\"" + string(progpath) + "\"";
Command backup = progdump + " " + "-u " + username + " " + "-p" + password + " " + dbname + " > " + dirName + "/" + dumpName + ".sql";
Command delOld = delCommand + " \"" + fileDir + "/" + file + ".sql\"";
cout << "Back Up process is on-going..." << endl << "Please wait for a moment..." << endl;
Sleep (500);
system (redir.c_str());
system (delOld.c_str());
system (backup.c_str());
cout << "Back Up Completed Successfully!";
Sleep (500);
return;
}
Program_Path
это определение типа char [99]
, Остальные «странные» типы данных — это просто строки (я использовал typedef
им определить, какая переменная должна использоваться в конкретном случае). Моя Java-программа будет работать на NetBeans Projects
папка на Documents
папка. Когда я запускаю свой проект в NetBeans, это будет вывод:
Back Up process is on-going...
Please wait for a moment...
The system cannot find the path specified.
The system cannot find the path specified.
Back Up Completed Successfully!
Задача ещё не решена.
Других решений пока нет …