क्या विंडोज फाइल पथों को यूनिक्स फ़ाइल पथों में बदलना एक साधारण प्रतिस्थापन के साथ सुरक्षित है?


12

उदाहरण के लिए कहते हैं कि मैं यह इतना था कि मेरी फ़ाइलों के सभी तरह के रूप में एक यूनिक्स मशीन के लिए एक विंडोज़ मशीन से स्थानांतरित कर दिया जाएगा: C:\test\myFile.txtकरने के लिए {somewhere}/test/myFile.txt(ड्राइव अक्षर इस बिंदु पर अप्रासंगिक है)।

वर्तमान में, हमारी उपयोगिता पुस्तकालय जो हमने खुद लिखी है, एक विधि प्रदान करती है जो आगे के स्लैश के साथ सभी बैक स्लैशों का एक सरल प्रतिस्थापन करती है:

public String normalizePath(String path) {
   return path.replaceAll("\\", "/");
}

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


4
बस रिक्त स्थान के लिए बाहर देखो - विंडोज़ फ़ोल्डर नामों में रिक्त स्थान डालना यूनिक्स निर्देशिका नामों की तुलना में बहुत अधिक सामान्य है। विशेष रूप से, "\ Program Files" मुझे हर समय मिलता है। आप रास्तों का उपयोग कैसे कर रहे हैं, इसके आधार पर, आपको रिक्त स्थान "\" से बचाना पड़ सकता है।
रोब

1
@ सादगी के लिए, चलो चर रास्तों को बाहर करने के लिए रास्तों के दायरे को सीमित करते हैं।
MxLDevs

2
@MxyL समस्या तब दूर नहीं होती जब आप एक पर्यावरण चर का उपयोग करने के बजाय पथ को हार्ड-कोड करते हैं। यदि आप बस एक ऐसा रास्ता चाहते हैं, जो आपको उड़ा न दे, तो आपको ठीक होना चाहिए। यदि आप एक सार्थक पथ चाहते हैं, या यदि आप अन्य सॉफ़्टवेयर (या उपयोगकर्ता अपेक्षाओं ...) के साथ सहभागिता करना चाहते हैं, तो आपको प्रति-पथ निर्णय कॉल की आवश्यकता है।

1
@delnan मैं मुख्य रूप से एक मान्य पथ के निर्माण पर केंद्रित है, लेकिन यह एक अच्छा बिंदु है। मैं जिन मार्गों को परिवर्तित कर रहा हूं, वे सरल होने चाहिए कि वे स्वयं से सार्थक हों।
MxLDevs

3
लिनक्स पर फ़ाइल नाम में बैकस्लैश की अनुमति है, इसलिए लिनक्स पथ में बैकस्लैश की जगह अमान्य निर्देशिकाओं को जोड़ सकता है। उदाहरण के लिए, लिनक्स पर /foo\\barसमतुल्य नहीं है /foo/bar

जवाबों:


7

हां, यदि आप केवल विंडोज पर प्रतिस्थापन करते हैं, और अन्य प्रणालियों पर चलने पर इसे बंद कर देते हैं।

पर प्रतिस्थापन कर यूनिक्स सिस्टम है गलत है क्योंकि \एक है पर प्लेटफार्मों यूनिक्स की तरह एक फ़ाइल या निर्देशिका नाम में मान्य वर्ण। इन प्लेटफार्मों पर, केवल NULऔर /फ़ाइल और निर्देशिका नाम में इनकार किया जाता है।

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


4

हां, लेकिन यह पूरी बात एक म्यूट प्वाइंट है। जावा मूल विंडोज पर स्लैश को वापस करने के लिए आगे स्लैश को परिवर्तित करता है। आप बस उन सभी रास्तों के लिए फॉरवर्ड स्लैश का उपयोग कर सकते हैं जो हार्ड-कोडेड हैं या कॉन्फ़िगरेशन में संग्रहीत हैं और यह दोनों प्लेटफार्मों के लिए काम करेगा।

व्यक्तिगत रूप से, मैं हमेशा भी विंडोज पर फ़ॉरवर्ड स्लैश उपयोग करें, क्योंकि यह है नहीं भागने चरित्र। चाहे कच्चे रास्ते कोड में हों या प्रॉपर्टीज़ फ़ाइल में एक्सटर्ाइज़ किए गए हों, मैं इसे उसी तरह से एनकोड करता हूं।

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

File f = new File("c:/some/path/file.txt");
if (!f.canRead()) {
  System.out.println("Uh oh, Snowman was wrong!");
}

बोनस: आप एक ही रास्ते में स्लैश भी मिला सकते हैं !

File f = new File("c:/some\\path/file.txt");
if (!f.canRead()) {
  System.out.println("Uh oh, Snowman was wrong again!");
}

1
यदि आप मेरा पूरा उत्तर पढ़ते हैं, तो आप देखेंगे कि मैं कहाँ कहता हूँ कि हमेशा यूनिक्स फ़ाइल विभाजक का उपयोग करना दोनों स्थानों में सही ढंग से काम करेगा, किसी भी रूपांतरण की आवश्यकता नहीं है।

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

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

कृपया मेरी पिछली टिप्पणी पढ़ें।

1
विंडोज फेवरर्ड और बैकस्लैश दोनों को पहचानता है, और प्रारंभिक एमएस-डॉस के बाद से इस तरह से रहा है। यानी हर Microsoft OS कर्नेल में आगे स्लैश सेपरेटर सपोर्ट होता है। शुरुआती COMMAND.COMदुभाषियों के पास एक रन-टाइम वरीयता थी: आप कॉन्फ़िगर कर सकते हैं कि छपाई और पार्सिंग के लिए दुभाषिया किस स्लैश का उपयोग करेगा।
काज

3

विंडोज पर एक और जटिलता यह है कि यह UNC अंकन के साथ-साथ पारंपरिक ड्राइव अक्षरों का भी समर्थन करता है।

एक दूरस्थ फ़ाइल सर्वर पर एक फ़ाइल के रूप में पहुँचा जा सकता है \\server\sharename\path\filename


1
मुझे लगता है कि यह अब तक उद्धृत एकमात्र चिंता है जो वास्तव में इस एप्लिकेशन के लिए एक समस्या है। यदि यूएनसी मार्ग शामिल हैं, तो उन्हें उपयोगी रूप से यूनिक्स-शैली पथ में परिवर्तित नहीं किया जा सकता है।
जूल्स

2

नहीं , पथ विभाजक ("\ vs /" बात) की तुलना में कहीं अधिक सोचने योग्य बातें हैं। जैसा कि रोब वाई का उल्लेख है, वहाँ है कि कैसे रिक्त स्थान को संभाला जाता है, और विंडोज उपयोग में उनकी उच्च आवृत्ति। दो वातावरणों में अलग-अलग अवैध चरित्र हैं। जब एक प्रमुख "\" द्वारा भाग जाने पर लगभग कुछ भी अनुमति देने के लिए यूनिक्स की इच्छा है। एम्बेडेड स्पेस से निपटने के लिए '’’ ’का विंडोज उपयोग है। UCS-16 का विंडोज का उपयोग है और यूनिक्स का ASCII या UTF-8 का उपयोग है।

आदि , आदि , आदि

लेकिन , बहुत सारे अनुप्रयोगों के लिए, जिन मार्गों में उन्हें हेरफेर करने की आवश्यकता होती है, उन पर अड़चनें डाल सकते हैं, आप वास्तव में इसे केवल आपके सुझाव के अनुसार कर सकते हैं। और यह कम से कम बड़ी संख्या में मामलों में काम करेगा, सिर्फ उन सभी में नहीं।


1
मुझे नहीं लगता कि ये चिंताएं सवाल के लिए मान्य हैं क्योंकि अंतरिक्ष से निपटने के लिए एक यूजर इंटरफेस मुद्दा है; यूनिक्स सिस्टम सिर्फ विंडोज के साथ-साथ फ़ाइलनामों में रिक्त स्थान को संभाल सकते हैं। विंडोज अवैध वर्ण यूनिक्स के एक सुपरसेट हैं। विंडोज फाइलनाम (निर्देशिका विभाजकों के अलावा अन्य जो परिवर्तित किया जाएगा) में कोई भी बैकस्लैश नहीं हो सकता है। एम्बेडेड रिक्त स्थान के लिए उद्धरण का उपयोग करना एक उपयोगकर्ता इंटरफ़ेस स्तर की चिंता है, न कि फ़ाइल हैंडलिंग समस्या। रूपांतरण कोड जाहिरा तौर पर जावा में है, इसलिए UCS16-> UTF8 रूपांतरण को स्वचालित रूप से संभालना चाहिए।
जूल्स

-1

MS-DOS से शुरू होने वाला हर Microsoft ऑपरेटिंग सिस्टम, कर्नेल स्तर पर, आगे की स्लैश और बैकस्लैश दोनों को समझ गया है ।

इसलिए, विंडोज पर, आप उनके बीच स्वतंत्र रूप से परिवर्तित कर सकते हैं; दोनों को आरक्षित विभाजक के समान दर्जा प्राप्त है। किसी भी मान्य पथ में, आप बैकस्लैश को स्लैश के साथ बदल सकते हैं और इसके विपरीत, इसका अर्थ बदले बिना, जहां तक ​​कर्नेल का संबंध है।

डॉस के शुरुआती संस्करणों में, माइक्रोसॉफ्ट के command.comदुभाषिया ने इसे एक कॉन्फ़िगर करने योग्य वरीयता दी, जो पथ को प्रदर्शित करने और पार्स करने के लिए स्लैश का उपयोग किया गया था। जिसे आखिरकार हटा दिया गया।

विंडोज में कुछ यूजर-स्पेस प्रोग्राम जैसे, ओह, विंडोज शेल ( explorer.exe) फॉरवर्ड स्लैश पसंद नहीं करते हैं। यह उन कार्यक्रमों में सिर्फ घटिया प्रोग्रामिंग है।


1
हालांकि यह सच है, मेरा मानना ​​है कि यह ओपी के प्रश्न के लिए मददगार है, जिसमें (एआईयूआई) मौजूदा पथ नामों को परिवर्तित करना शामिल था, जिसमें पहले से ही बैकस्लैश शामिल थे। यह है एहसास है कि तुम सिर्फ फ़ॉरवर्ड स्लैश का उपयोग करें और उन्हें सबसे अधिक संदर्भों में काम हो सकता है पार मंच कोड लिखने के लिए बहुत उपयोगी है, लेकिन इस मामले में मुझे नहीं लगता कि यह मदद करता है है।
जूल्स

@ जूल्स ओपी विंडोज से फाइल ट्रांसफर कर रहा है। यह उत्तर बताता है कि प्रतिस्थापित करने के लिए कोई बैकस्लैश नहीं हैं। वे विंडोज फाइलसिस्टम में ही नहीं हैं। सभी रास्ते आगे की स्लैश के साथ स्पष्ट हैं (और विंडोज भी इसे समझता है)।
काज
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.