2012-12-21 15 views
6

मैं अपनी प्रक्रिया में एक थर्ड-पार्टी डीएलएल को एक फ़ाइल पढ़ने से पढ़ने की कोशिश कर रहा हूं, और मैंने इसे पाया है ... अच्छा, असंभवविंडोज़ की CreateFile (<कोई साझा एक्सेस>) क्यों झूठ बोल रही है?

कोई फर्क नहीं पड़ता कि मैं क्या करता हूं, इससे कोई फर्क नहीं पड़ता कि मैं क्या शेयर झंडे निर्दिष्ट करता हूं, उनकी कॉल हमेशा सफल होने लगती है!

यहाँ प्रक्रिया मॉनिटर से स्क्रीनशॉट है - पहली CreateFile कॉल मेरा है, और बाकी उनकी हैं:

Screenshot

यह कैसे भी संभव है? क्यों है "साझा मोड: कोई नहीं" मुझसे झूठ बोल रहा है, और मैं इसे कैसे रोक सकता हूं?

#include <stdio.h> 
#include <Windows.h> 

int main() 
{ 
    LPCTSTR file = TEXT("C:\\Test1234.xml"); 
    HANDLE hFile1 = 
     CreateFile(file, FILE_READ_ATTRIBUTES, 0, NULL, OPEN_ALWAYS, 0, NULL); 
    HANDLE hFile2 = 
     CreateFile(file, FILE_READ_DATA, 0, NULL, OPEN_ALWAYS, 0, NULL); 
    DWORD n; 
    BYTE buf[1]; 
    printf("%d\n", ReadFile(hFile2, buf, sizeof(buf), &n, NULL)); 
    CloseHandle(hFile1); 
    CloseHandle(hFile2); 
    DeleteFile(file); 
} 
+0

यह भी उल्लेखनीय है कि मुझे नहीं पता कि वे फ़ाइल की I/O प्राथमिकता को शुरुआत में "बहुत कम" पर कैसे सेट करते हैं। क्या प्रत्येक फ़ाइल में "सामान्य" प्राथमिकता नहीं है जब तक कि यह परिवर्तित न हो जाए? – Mehrdad

+0

कृपया अपना कोड दिखाएं जो फ़ाइल खोलता है। –

+0

@RemyLebeau: अद्यतन देखें। – Mehrdad

उत्तर

1

शेयर मोड वास्तव में पढ़ रहे हैं और फ़ाइल के आंकड़े लिखने के लिए लागू की गई हैं:


नीचे इस कोड को एक उदाहरण है कि समस्या पुनरुत्पादित करता है। गुण (जैसे फ़ाइल का आकार, टाइमस्टैम्प, इत्यादि) साझाकरण नियमों द्वारा कवर नहीं होते हैं और एसीएल से कम पहुंच को रोकने के लिए कोई रास्ता नहीं है।

आर/डब्ल्यू/डी एक्सेस के लिए फ़ाइल खोलने के लिए सबसे अच्छा है और SHARE_READ | WRITE | DELETE निर्दिष्ट नहीं है।

अजीब, लेकिन सच।

+0

हालांकि मैं गुणों को पढ़ने से रोकने की कोशिश नहीं कर रहा था ... मैं डेटा पढ़ने को रोकने की कोशिश कर रहा था। – Mehrdad

+0

एमजेजेड का क्या अर्थ है कि फ़ाइल फ़ाइल को पढ़ने/लिखने के बाद आपको साझा करने के अधिकारों को निर्दिष्ट करने के लिए फ़ाइल डेटा को पढ़ने/लिखने के लिए फ़ाइल खोलनी होगी। यदि आप केवल गुणों को पढ़ने के लिए फ़ाइल खोलते हैं, तो आप फ़ाइल डेटा को पढ़ने/लिखने वाले खुलने के लिए एक्सेस साझा नहीं कर सकते हैं। –