2010-09-30 13 views
56

हम कैसे जांच सकते हैं कि फ़ाइल Win32 प्रोग्राम का उपयोग कर रही है या नहीं? मैं विंडोज मोबाइल ऐप के लिए काम कर रहा हूं।हम कैसे जांच सकते हैं कि फ़ाइल Win32 प्रोग्राम का उपयोग कर रही है या नहीं?

उत्तर

20

आप FindFirstFile कॉल कर सकते हैं।

#include <windows.h> 
#include <tchar.h> 
#include <stdio.h> 

int fileExists(TCHAR * file) 
{ 
    WIN32_FIND_DATA FindFileData; 
    HANDLE handle = FindFirstFile(file, &FindFileData) ; 
    int found = handle != INVALID_HANDLE_VALUE; 
    if(found) 
    { 
     //FindClose(&handle); this will crash 
     FindClose(handle); 
    } 
    return found; 
} 

void _tmain(int argc, TCHAR *argv[]) 
{ 
    if(argc != 2) 
    { 
     _tprintf(TEXT("Usage: %s [target_file]\n"), argv[0]); 
     return; 
    } 

    _tprintf (TEXT("Looking for file is %s\n"), argv[1]); 

    if (fileExists(argv[1])) 
    { 
     _tprintf (TEXT("File %s exists\n"), argv[1]); 
    } 
    else 
    { 
     _tprintf (TEXT("File %s doesn't exist\n"), argv[1]); 
    } 
} 
+0

आप 'FindClose' को कॉल करना भूल गए। और आप शून्य कार्य से मूल्य वापस नहीं कर सकते हैं। –

+0

@ डेविड हेफरन - सही - धन्यवाद। –

+3

आधा सही। आपको FILE_ATTRIBUTE_DIRECTORY की जांच करनी होगी। –

28

आप समारोह GetFileAttributes का उपयोग कर सकते। यदि फ़ाइल मौजूद नहीं है तो यह 0xFFFFFFFF लौटाता है।

+11

GetFileAttributes पर दिलचस्प इतिहास और क्यों यह रेमंड चेन द्वारा विंडोज कोड में पसंदीदा तरीका है: http://blogs.msdn.com/b/oldnewthing/archive/2007/10/23/5612082.aspx –

+1

आपको ऑब्जेक्ट निर्देशिका होने की जांच करने की आवश्यकता है। –

+6

असल में यह 'INVALID_FILE_ATTRIBUTES' लौटाता है यदि फ़ाइल मौजूद नहीं है। 64-बिट पर यह '0xFFFFFFFFFFFFFFFF' हो सकता है। –

158

उपयोग GetFileAttributes जाँच करने के लिए है कि फाइल सिस्टम वस्तु मौजूद है और यह एक निर्देशिका नहीं है कि:

यहां एक नमूना मैं सिर्फ खटखटाया है।

BOOL FileExists(LPCTSTR szPath) 
{ 
    DWORD dwAttrib = GetFileAttributes(szPath); 

    return (dwAttrib != INVALID_FILE_ATTRIBUTES && 
     !(dwAttrib & FILE_ATTRIBUTE_DIRECTORY)); 
} 

से How do you check if a directory exists on Windows in C?

+3

+1 एक शॉर्ट कोड उदाहरण की वजह से कहा जाता है * नहीं है। कोड उदाहरण शुरू करने के लिए एक समय बचतकर्ता है। – nalply

+0

मैं यह ध्यान रखना चाहूंगा कि आपका फ़ंक्शन बूल लौटाता है, न कि बूल। –

+0

सी ++ हां के लिए, सी के लिए, यह एक बूल –

1

की प्रतिलिपि की गई फ़ाइल को खोलने का प्रयास कर सकते हैं। यदि यह असफल रहा, तो इसका अर्थ अधिकांश समय में मौजूद नहीं है।

+0

मैं CreateFile -> CloseHandle के साथ जाऊंगा। सबसे आसान और सबसे सस्ता। – OSH

+1

फाइलें मौजूद होने पर फ़ाइल खोलने में भी असफल हो सकता है लेकिन उपयोगकर्ता को फ़ाइल खोलने के लिए पर्याप्त विशेषाधिकार नहीं हैं। इन दिनों, यह एक ** बहुत ** आम स्थिति है। – JackLThornton

6

एक अन्य विकल्प: 'PathFileExists'

लेकिन मैं शायद GetFileAttributes साथ जाना चाहते हैं।

+1

इसके अतिरिक्त 'PathFileExists' के लिए "Shlwapi" के उपयोग की आवश्यकता है।डीएल "(जो कुछ विंडोज़ संस्करणों पर अनुपलब्ध है) और इस अच्छे विकल्प – Bitterblue

+1

+1 लेकिन यह आपको नहीं बताता कि फ़ाइल या निर्देशिका मौजूद है या नहीं। –

+0

के लिए 'GetFileAttributes' से थोड़ा धीमा है। –

0

एक और अधिक सामान्य गैर खिड़कियों रास्ता:

के बारे में कैसे
static bool FileExists(const char *path) 
{ 
    FILE *fp; 
    fpos_t fsize = 0; 

    if (!fopen_s(&fp, path, "r")) 
    { 
     fseek(fp, 0, SEEK_END); 
     fgetpos(fp, &fsize); 
     fclose(fp); 
    } 

    return fsize > 0; 
} 
+0

यदि आप जा रहे हैं फॉपेन एट अल का उपयोग करें। आप '_access (0)' का उपयोग भी कर सकते हैं। –

12

बस:

#include <io.h> 
if(_access(path, 0) == 0) 
    ... // file exists 
संबंधित मुद्दे

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