यह आश्चर्य की बात है कि आप जो कमांड दिखाते हैं वह बिल्कुल काम करता है, क्योंकि आप कमांड पथ में रिक्त स्थान को उद्धृत करने में विफल हो रहे हैं। कोशिश करें:
String[] cmd = {
"D:\\Program Files\\PostgreSQL\\9.1\\bin\\pg_restore.exe",
"--host", "localhost",
"--port", "5432",
"--username", "postgres",
"--dbname", "mytestqq",
"--role", "postgres",
"--no-password",
"--verbose",
"D:\\sathish\\rawDatabase.backup"
};
p = r.exec(cmd);
परिवर्तन:
- एकल-स्ट्रिंग प्रपत्र को
exec
. के अधिक सुरक्षित तर्क सरणी प्रपत्र में बदलें कॉल करें; - बैकस्लैश को
rawDatabase
में दोगुना करें पथ क्योंकि आपका मूल आदेश बैकस्लैश से बचने में विफल रहता है, इसलिए\r
\
. के बजाय स्ट्रिंग में कैरिज रिटर्न है चार के बादr
चार। - एकरूपता के लिए प्रोग्राम पथ पर फॉरवर्ड स्लैश के बजाय डबल बैकस्लैश पर स्विच करें। यह बदलाव शायद कोई मायने नहीं रखता।
प्रक्रिया की वापसी स्थिति भी जांचें। आपको Process.waitFor()
फिर एक बार बाहर निकलने के बाद Process.exitValue()
परिणाम निर्धारित करने के लिए। आपको Process
. द्वारा कैप्चर किए गए stderr और stdout की जांच करनी चाहिए त्रुटियों और लॉगिंग जानकारी के लिए आपत्ति।
आपके प्रोग्राम के काम न करने का कारण शायद इसलिए है:
- आपके पास पुराना
pg_restore
है ताले पकड़ने के आसपास लटकने वाली प्रक्रियाएं; और/या - आप stdout और stderr का सेवन नहीं कर रहे हैं इसलिए
pg_restore
बफर्ड पाइप स्पेस खत्म हो जाता है और आउटपुट स्ट्रीम पर राइटिंग ब्लॉक हो जाती है।
यह सब बहुत आसान हो जाएगा यदि आप प्रोसेसबिल्डर
का उपयोग करें इसके बजाय
. प्रोसेसबिल्डर आपको आउटपुट लिखने के लिए फ़ाइल स्ट्रीम प्रदान करने देता है और आम तौर पर आपके लिए इसका बहुत ख्याल रखता है। आपको अभी भी प्रक्रिया के समाप्त होने की प्रतीक्षा करनी चाहिए और इसके रिटर्न कोड की जांच करनी चाहिए।