2009-12-07 8 views
7

मैं एफएफएमपीईजी के लिए एक पूर्ण फ़ाइल पथ पास करने की कोशिश कर रहा हूं।सी # - रिक्त स्थान के साथ फ़ाइल नाम का विश्लेषण करने का सबसे आसान तरीका उदाहरण के लिए। "सी: टेस्ट फ़ाइल spaces.txt के साथ"

C:\TestFolder\Input\Friends - Season 6 - Gag Reel.avi 

और यह स्पष्ट रूप से तथ्य यह है पथ, उस में रिक्त स्थान है इसलिए जैसे erroring पसंद नहीं कर रहा है:

C:\TestFolder\Input\Friends: no such file or directory 

तो उन में रिक्त स्थान के साथ फ़ाइल नाम का उपयोग करने के लिए सबसे आसान तरीका क्या है? क्या मुझे बस सभी सफेद जगहों को ~ अक्षर के साथ बदलना चाहिए या क्या कोई बेहतर तरीका है? मैंने विभिन्न पात्रों के साथ स्ट्रिंग से बचने की कोशिश की है:

@"C:\TestFolder\Input\Friends - Season 6 - Gag Reel.avi"; 

लेकिन यह काम नहीं करता है। क्या रिक्त स्थान को संरक्षित करने के लिए कोई चाल है?

+1

किस तरह से "उपयोग करें"? रिक्त स्थान के साथ अब समस्या क्या है? –

+0

आप मूवी फाइल को किस प्रोग्राम में खिला रहे हैं? – Woot4Moo

+0

अपडेटेड प्रश्न - क्षमा करें दोस्तों –

उत्तर

33

एकमात्र समय आपको आमतौर पर फाइलनामों के साथ कोई विशेष हाथ करना होगा जिसमें रिक्त स्थान होते हैं जब आप उन्हें बाहरी टूल या प्रारूप में भेज रहे होते हैं।

string path = @"C:\TestFolder\Input\Friends - Season 6 - Gag Reel.avi"; 
ProcessStartInfo psi = new ProcessStartInfo(); 
psi.FileName = "program.exe"; 
psi.Arguments = "\"" + path + "\""; // escape the quotes 

... जो इस कमांडलाइन में परिणाम होगा:

कार्यक्रम आप उदाहरण के लिए, एक बाहरी निष्पादन के लिए एक तर्क सूची का निर्माण कर रहे हैं, तुम सब करने की है पथ बोली है .exe "C: \ TestFolder \ इनपुट \ दोस्त - सीजन 6 - गैग Reel.avi"

+2

"\" "+ पथ +" के साथ अंतिम तर्क सूची को लपेटना \ "" एक इलाज किया। नोबी सवाल मुझे पता है: पी –

+0

मेरे लिए भी काम किया, धन्यवाद .... –

7

System.IO। Path फ़ाइल नामों में हेरफेर करने के लिए कई विधियां प्रदान करता है ...

+0

विशेष रूप से: http://msdn.microsoft.com/en-us/library/system.io.path.getfilename.aspx – Juliet

4

सामान्य में, फ़ाइल पथ कमांड लाइन पर तर्क के रूप में पारित की आवश्यकता होती है पथ उद्धरण चिह्नों के साथ घिरा हो।

यदि आप फ़ाइल पथ को अपने प्रोग्राम के लिए तर्क के रूप में स्वीकार करने के बारे में बात कर रहे हैं, तो उपयोगकर्ताओं को पथ उद्धृत करने की आवश्यकता सबसे आसान है। इस तरह, args आपकी मुख्य विधि के लिए तर्क में एक ही स्ट्रिंग के रूप में संपूर्ण पथ होगा।

यदि आप अन्य प्रोग्रामों को कॉल कर रहे हैं और तर्क पारित कर रहे हैं, तो रिक्त स्थान के साथ फ़ाइल पथ उद्धृत किए जाने चाहिए।

Process p = new Process(); 
p.StartInfo.FileName = "notepad.exe"; 
p.StartInfo.Arguments = string.Format("\"{0}\"", filePath); 
p.Start(); 
5

क्या आप FileInfo कक्षा का उपयोग कर रहे हैं?

इसमें गुणों और फ़ाइल संस्करणों सहित फ़ाइल के बारे में सबकुछ शामिल है, और आपको रिक्त स्थान या अन्य अवांछित पात्रों के बारे में चिंता करने की आवश्यकता नहीं है। जब तक फ़ाइल मौजूद है, यह फ़ाइलइन्फो पर अच्छी तरह से काम करता है।

रूप
FileInfo f = new FileInfo(fullPathEvenWithSpaces);

-2

सभी फाइलें यह प्रयोग एक छोटी पथ नाम डॉस 8.3 संगत है कि है। उस फ़ाइल नाम को पाने का एकमात्र तरीका GetShortPathName है। सबसे अच्छा विवरण मैं मिल सकता है निम्न पते पर है:

http://www.pinvoke.net/default.aspx/kernel32.GetShortPathName

4

मैं ऊपर पोस्ट के साथ सहमत हैं। इसे आसान बनाने के लिए, यहां वह कोड है जिसका उपयोग करने के लिए आपको आवश्यक है। मेरी विनम्र राय में, एकमात्र अच्छी फ़ाइल नाम एक स्पेस-फ्री फ़ाइल नाम है।

वजह मैं सी # कोड में इस:

[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
static extern uint GetShortPathName(
    [MarshalAs(UnmanagedType.LPTStr)] 
    string lpszLongPath, 
    [MarshalAs(UnmanagedType.LPTStr)] 
    StringBuilder lpszShortPath, 
    uint cchBuffer); 

public static StringBuilder shortNameBuffer = new StringBuilder(256); 
public static string ToShortPathName(string longName) 
{ 
    uint result = GetShortPathName(longName, shortNameBuffer, 256); 
    return shortNameBuffer.ToString(); 
} 

अपने वर्ग है कि इस तरह इस्तेमाल किया जा सकता के लिए एक विधि कहते हैं कि:

स्ट्रिंग goodFileName = ToShortPathName (evilFileName);

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