2011-01-19 7 views
5

मैं जब मैंने इसे क्यूटी निर्माता से चलाने के निष्पादनक्यूटी वर्तमान डीआईआर में फाइल कैसे खोलें? या इसके साथ क्या गलत है?

 QString path = QDir::currentPath(); 
     path.append("/acc.xml"); 
     QFile file(path); 

     if(!file.open(QIODevice::ReadOnly)) 
     { 
      insertItem("IO ERR"); 
     } 
  • की वर्तमान स्थान में एक xml फ़ाइल को खोलने के लिए कोशिश कर रहा हूँ, सब कुछ काम करता है। currentPath() निष्पादन के फ़ोल्डर

  • के लिए पथ देता है जब मैं project-build-desktop/ फ़ोल्डर में जाने के लिए और इसे मैन्युअल रूप से currentPath() रिटर्न /home/user/Documents

संपादित चलाने का प्रयास

भी एक ही परिणाम के साथ की कोशिश की:

Qt::current().path(); 
Qt::current().absolutePath(); 
+1

समस्या स्पष्ट रूप से दस्तावेज़ के पथ से आता है। –

+0

सही तरीका क्या है? मैंने क्यूटी – sdadffdfd

उत्तर

2

चेक k QDir::currentPath() का लौटा मूल्य। मुझे लगता है कि जब आप क्यूटी निर्माता से भागते हैं, तो वह पथ लौटाता है जहां प्रोजेक्ट फ़ाइल (* .pro) स्थित है। जब आप बाहर से भागते हैं, तो आपको बाइनरी का मार्ग मिलता है।

संपादित

मैं लिनक्स के साथ काम नहीं। हालांकि, अगर आप QDir से अन्य कार्यों/संयोजनों की कोशिश कर सकते हैं:।

  • QDir :: वर्तमान() पथ()
  • QDir :: वर्तमान() absolutePath()

आदि

+0

को इसके बाहर/'home/user/दस्तावेज़ों 'के बाहर से समझने/समझने की कोशिश करने में लगभग 2 घंटे पहले ही खर्च किए हैं। लेकिन निष्पादन योग्य मैं चल रहा हूं स्पष्ट रूप से नहीं है ... – sdadffdfd

+0

मुझे वास्तव में बाइनरी के पथ की आवश्यकता है ... और यह तब नहीं हो रहा है जब मैं इसे – sdadffdfd

+0

@Vic से चलाता हूं .: कृपया संपादन की जांच करें। – Donotalo

2

वर्तमान निर्देशिका में एक फ़ाइल को खोलने के लिए, आप बस QFile निर्माता फोन

मैं अपने Linux मशीन पर यह परीक्षण किया है और यह काम करता है

#include <QtCore> 

int main(int argc, char** argv){ 
    QFile some_file("test.xml"); 
    if(!some_file.open(QIODevice::ReadOnly | QIODevice::Text)){ 
     qDebug() << "Unable to open file"; 
    } else { 
     qDebug() << "File open successfully"; 
    } 
    exit(-1); 
} 

मैं चलाता हूं ./TestQFile और यदि वर्तमान निर्देशिका में test.xml है, तो यह काम करता है।

अद्यतन:

// Getting directory of the executable 
QFileInfo exec_fileinfo(argv[0]); 
qDebug() << "Executable is in" << exec_fileinfo.absolutePath(); 

अद्यतन 2:: मैं नोटिस आपके प्रश्न के शब्दों का कहना है कि यह है कि आप निष्पादन योग्य उसी निर्देशिका में फ़ाइल चाहते हैं, यह इस प्रकार किया जा सकता है की परियोजना पैनल के अधीन QtCreator, कार्य निर्देशिका के लिए एक क्षेत्र है। यह निर्देशिका है जिसे QDir :: currentPath() द्वारा वापस किया जाता है यदि आप इसे QtCreator के माध्यम से चला रहे हैं।

+0

मैंने इसे कोड करने के लिए QtCreator का उपयोग नहीं किया। क्या आप अपनी निर्देशिका संरचना और सटीक कमांड पर अधिक जानकारी दे सकते हैं जिसे आपने फ़ाइल खुली त्रुटि को पुन: उत्पन्न करने के लिए चलाया था? –

+0

ऐसा लगता है कि QtCreator मेरी प्रोजेक्ट चलाते समय किसी प्रकार का 'जादू' करता है। यह एक जीयूआई एप्लीकेशन है जिसे मैं डिजाइन करने की कोशिश कर रहा हूं। 'बाहर' से मैं आमतौर पर बिना किसी तर्क के एप्लिकेशन चलाता हूं, बस 'क्लिक करें' – sdadffdfd

+0

यह देखने का प्रयास किया कि QtCreator इसे कैसे चलाता है .. केवल पाया गया: 'प्रारंभ/घर/उपयोगकर्ता/परियोजनाएं/परियोजना-निर्माण-डेस्कटॉप/परियोजना ... ' – sdadffdfd

1

मैं जबकि एक ऐसी ही समाधान के लिए खोज इस चर्चा पाया देखें। मुझे लगता है कि एक बाहरी फ़ाइल खोलने का सबसे पोर्टेबल तरीका जिसमें एक निश्चित नाम है (और कोई संवाद और उपयोगकर्ता शामिल नहीं है) Resource System का उपयोग करना है।

मेरे मामले में मैंने उपसर्ग /config के साथ एक नई संसाधन फ़ाइल बनाई और फ़ाइल को जोड़ा (जिसे settings.xml कहा जाता है)। कोड के अंदर, मुझे किसी भी पथ फ़ंक्शन का उपयोग करने की आवश्यकता नहीं है। मैं इसके बजाए संसाधन प्रणाली का उपयोग करता हूं। इस प्रकार QFile file(":/config/settings.xml") जैसे कॉल ठीक काम करते हैं। विंडोज पर क्यूटी निर्माता 2.0.1 और क्यूटी 4.7 का उपयोग करना।

+0

खुद को टिप्पणी करने के लिए, यह समाधान काम करता है लेकिन XML फ़ाइल को संशोधित करने में सक्षम नहीं होने का नुकसान होता है क्योंकि इसे बाइनरी संसाधन फ़ाइल में परिवर्तित किया जाता है। यदि आपको एक्सएमएल सामग्री को संशोधित करने और बिना किसी संकलन के आवेदन को निष्पादित करने में सक्षम होना चाहिए, तो यहां दिए गए बाकी समाधानों में से एक का उपयोग करें। – ierax

संबंधित मुद्दे