2015-09-10 9 views
7

जिस कंपनी के साथ मैं काम कर रहा हूं, वह पुराना vb6 में लिखा गया एक प्रोग्राम है, जिसे अक्सर अद्यतन किया जाता है, और अधिकांश क्लाइंट मैप किए गए नेटवर्क ड्राइव से निष्पादन योग्य चलाते हैं। इसमें वास्तव में आश्चर्यजनक रूप से कुछ मुद्दे हैं, जिनमें से सबसे बड़ा स्वचालित अपडेट है। वर्तमान में अद्यतनकर्ता प्रोग्राम (सी ++ में लिखा गया) मौजूदा exe का नाम बदलता है, फिर नए संस्करण को पुराने संस्करण के स्थान में डाउनलोड और स्थान देता है। यह आमतौर पर ठीक काम करता है, लेकिन कुछ वातावरण में यह बस विफल रहता है।साझा फ़ाइलों को प्रोग्रामेटिक रूप से बंद करें

समाधान this command from microsoft:

for /f "skip=4 tokens=1" %a in ('net files') do net files %a /close 

चल रहा है यह आदेश सभी नेटवर्क फ़ाइलों कि (ठीक है ... सबसे) साझा कर रहे हैं और उसके बाद अपडेटर exe की जगह ले सकता बंद कर देता है।

C++ में मुझे लगता है कि आदेश को चलाने के लिए System(""); समारोह का उपयोग कर सकते हैं, या मैं प्रश्न में विशेष फ़ाइल की तलाश में परिणामों के माध्यम से net files के उत्पादन अनुप्रेषित सकता है, और पुनरावृति और net file /close आदेश चला उन्हें बंद करने के लिए। लेकिन अगर यह बेहतर विश्वसनीयता और भविष्य की सुरक्षा के लिए समान क्षमताओं वाले Winapi फ़ंक्शंस थे तो यह बहुत अच्छा होगा।

क्या मेरे लिए प्रोग्रामेटिक रूप से सभी नेटवर्क साझा फ़ाइलों को ढूंढने और प्रासंगिक लोगों को बंद करने का कोई तरीका है?

+0

ऐसा लगता है कि यह एक विंडोज विशिष्ट सी ++ प्रश्न है ... – shargors

+0

हां यह है, खेद है कि मैं एक टैग जोड़ूंगा – wizebin

+1

मैं आपको कुछ विंडोज़ एपीआई खोजने के लिए एमएसडीएन खोजने की सलाह देता हूं जो आपको नेटवर्क फ़ाइलों को बंद करने में मदद कर सकता है। –

उत्तर

7

आप प्रोग्राम कर सकते हैं net file /close करता है। बस lmshare.h शामिल करें और Netapi32.dll से लिंक करें। आपके पास उपयोग करने के लिए दो कार्य हैं: NetFileEnum सभी खुली नेटवर्क फ़ाइलों (किसी दिए गए कंप्यूटर पर) और NetFileClose को बंद करने के लिए गणना करें।

त्वरित (यह मान लिया गया कार्यक्रम एक ही सर्वर पर चल रहा है और वहाँ भी कई खुले कनेक्शनों नहीं हैं, अंतिम अनुच्छेद देखें) और गंदा (कोई त्रुटि जाँच) उदाहरण:

FILE_INFO_2* pFile = NULL; 
DWORD nRead = 0, nTotal = 0; 

NetFileEnum(
    NULL, // servername, NULL means localhost 
    "c:\\directory\\path", // basepath, directory where VB6 program is 
    NULL, // username, searches for all users 
    2, // level, we just need resource ID 
    (LPBYTE*)pFiles, // bufptr, 
    MAX_PREFERRED_LENGTH, // prefmaxlen, collect as much as possible 
    &nRead, // entriesread, number of entries stored in pFiles 
    &nTotal, // totalentries, ignore this 
    NULL //resume_handle, ignore this 
); 

for (int i=0; i < nRead; ++i) 
    NetFileClose(NULL, pFile[i].fi2_id); 

NetApiBufferFree(pFile); 

जानकारी के लिए MSDN का संदर्भ लें लगभग NetFileEnum और NetFileClose। ध्यान दें कि NetFileEnum अधिक डेटा उपलब्ध होने पर ERROR_MORE_DATA वापस कर सकता है।

+3

बहुत कम संशोधन के साथ यह बेकार ढंग से काम करता है। मेरे कंपाइलर ने एनम फ़ंक्शन में अंतिम न्यूल के बाद अतिरिक्त कॉमा के बारे में शिकायत की और मुझे पीएफआईल्स '(BYTE **) और pFiles' डालना पड़ा और 'pFile [i] -> fi2_id' से सदस्य पहुंच के बजाय पहुंच को बदलना पड़ा सूचक पहुंच 'पीएफआईएल [i] .fi2_id' – wizebin

+0

@ वाइज़बिन आप सही हैं, मैंने इसे परीक्षण के बिना यहां लिखा है। मेरा बुरा, धन्यवाद! –

+0

lpvoid लाइन को \t \t (LPBYTE *) और pFiles, // bufptr – Dan

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