2011-01-09 16 views
5

मैं एक क्यूटी प्रोग्राम (प्रारंभ में विंडोज 7 के लिए 4.7) लिख रहा हूं जिसके लिए स्थापित निर्देशिका (सी: \ प्रोग्राम फ़ाइलें ...) को लिखना आवश्यक है। जब मैं किसी ऐसे स्थान पर लिखने का प्रयास करता हूं जो "संरक्षित" (प्रोग्राम फ़ाइलें, सी: \ आदि) पर कोई फ़ाइल नहीं बनाई जा रही है। हालांकि, क्यूफाइल मुझे कोई त्रुटि कोड नहीं दे रहा है (त्रुटि() 0 लौट रही है जिसका अर्थ है कि यह ठीक काम करता है)।क्यूटी सी को नहीं बना/लिख नहीं सकता:

यहां एक कोड स्निपिट है जिसका उपयोग मैं कर रहा हूं जो काम नहीं कर रहा है। मैं प्रोग्राम में बस इतना ही बाद में फाइल बंद कर रहा हूं।

क्यूप्लिकेशंस ए (argc, argv);

// Setting plugin paths. 
QStringList paths = QCoreApplication::libraryPaths(); 
paths.append(QCoreApplication::applicationDirPath()); 
QCoreApplication::setLibraryPaths(paths); 



// Debug file. 
QString path = QCoreApplication::applicationDirPath() + "/debug.dat"; 
//QFile debugFile(QCoreApplication::applicationDirPath() + "/debug.dat"); 
QFile debugFile("C:/debug.txt"); 
qDebug() << debugFile.error(); 
debugFile.setPermissions(QFile::WriteUser | QFile::WriteGroup | QFile::WriteOwner | QFile::WriteOther); 
debugFile.open(QFile::WriteOnly); 
QTextStream debugStream(&debugFile); 

// Processing the arguments. 
debugStream << QString("Processing Arguments\n"); 

क्या किसी को इस समस्या को हल करने के बारे में कोई सुझाव है?

मदद के लिए धन्यवाद,

Jec


मालसूची फ़ाइल जोड़ना मार्ग इस समस्या को दूर करने के लिए मेरे द्वारा चुने गए है।

सभी मदद के लिए धन्यवाद।

+2

"हालांकि, क्यूफाइल मुझे कोई त्रुटि कोड नहीं दे रहा है": आपको debugFile.open() के वापसी मूल्य की जांच करनी चाहिए। –

उत्तर

7

क्या आपने जांच की है कि उस उपयोगकर्ता के लिए वर्चुअलस्टोर में फ़ाइल नहीं बनाई गई है या नहीं? एप्लिकेशन और सेवा लॉग के तहत इवेंट व्यूअर की जांच करें -> माइक्रोसॉफ्ट -> विंडोज़ -> यूएसीफ़ाइल वर्चुअलाइजेशन -> ऑपरेशनल। यदि आप इवेंट आईडी 5000 के साथ प्रविष्टियां देखते हैं, तो फ़ाइलक्रेटवर्टुअल एक्सक्लूस ईवेंट हुआ है।

जांचें कि फ़ाइल %USERPROFILE%\AppData\Local\VirtualStore के तहत बनाई गई है या नहीं। यदि ऐसा किया, तो आप एक प्रकट एम्बेड करने के लिए आवश्यक विशेषाधिकार का अनुरोध आवश्यकता हो सकती है (यानी, वर्चुअलाइजेशन बंद करने से।)

अधिक जानकारी के लिए New UAC Technologies for Windows Vista देखते हैं (नीचे स्क्रॉल करें और वर्चुअलाइजेशन के लिए देखें।)

+0

आप बिल्कुल सही थे। मेरी फाइलें वर्चुअल स्टोर में संग्रहीत की जा रही थीं (वैसे भी उनमें से अधिकतर। मेरे पास एक उपफोल्डर था जिसे किसी कारण से लगभग संग्रहीत नहीं किया जा रहा था)। मैंने मैनिफेस्ट जोड़ा ताकि मेरा प्रोग्राम अब वर्चुअल रूप से चल रहा हो। धन्यवाद। – jecjackal

2

आपको Windows Vista + में ऐसे फ़ोल्डरों को लिखने के लिए पर्याप्त उपयोगकर्ता पहुंच अधिकार (यानी "व्यवस्थापक के रूप में चलाएं") प्राप्त करने की आवश्यकता है। या तो ऐप को व्यवस्थापक के रूप में शुरू करें, या WinAPI को कॉल के माध्यम से व्यवस्थापक अधिकारों के लिए पूछें।

+0

AFAIK आप पहले से चल रहे प्रक्रिया के लिए व्यवस्थापक अधिकारों का अनुरोध नहीं कर सकते हैं लेकिन उन अनुमतियों की आवश्यकता वाले संचालन करने के लिए एक और प्रक्रिया शुरू करनी है। –

2

QFile देने किया जा सकता है आप एक त्रुटि कोड है, लेकिन आप इसकी जांच करने में विफल रहे हैं।

आप क्या करना चाहिए कुछ अधिक की तरह:

if (!debugFile.open(QFile::WriteOnly)) { 
    qWarning() << "Failed to open" << debugFile.fileName() << "for write:" << debugFile.errorString(); 
} 

आप QFile::error के रिटर्न मान देख लिया है, लेकिन केवल से पहले open बुला - आप खुला प्रयास के बाद जाँच करने के लिए की जरूरत है।

+0

वाह, आप सही थे। मैं फ़ाइल खोलने से पहले त्रुटि कोड की जांच कर रहा था। वैसे यह होता है जब मैं देर से कोडिंग रहता हूं :)। धन्यवाद। – jecjackal

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