การแปลงพา ธ ของไฟล์ Windows เป็นพา ธ ของไฟล์ Unix นั้นปลอดภัยหรือไม่?


12

ตัวอย่างเช่นบอกว่าฉันมีมันเพื่อให้ไฟล์ทั้งหมดของฉันจะถูกถ่ายโอนจากเครื่อง windows ไปยังเครื่องยูนิกซ์เช่น: C:\test\myFile.txtไปที่{somewhere}/test/myFile.txt(ตัวอักษรไดรฟ์ไม่เกี่ยวข้องในจุดนี้)

ขณะนี้ไลบรารียูทิลิตี้ของเราที่เราเขียนเองให้วิธีที่ง่าย ๆ ในการแทนที่แบ็กสแลชทั้งหมดด้วยสแลชสแลช:

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

เครื่องหมายทับถูกสงวนไว้และไม่สามารถเป็นส่วนหนึ่งของชื่อไฟล์ได้ดังนั้นโครงสร้างไดเรกทอรีควรถูกสงวนไว้ อย่างไรก็ตามฉันไม่แน่ใจว่ามีภาวะแทรกซ้อนอื่น ๆ ระหว่าง windows และเส้นทาง unix ที่ฉันอาจต้องกังวลเกี่ยวกับ (เช่น: ไม่ใช่ชื่อ ASCII ฯลฯ )


4
เพียงระวังช่องว่างการใส่ช่องว่างในชื่อโฟลเดอร์ windows เป็นเรื่องธรรมดามากกว่าในชื่อไดเรกทอรียูนิกซ์ โดยเฉพาะอย่างยิ่ง "ไฟล์โปรแกรม \" ทำให้ฉันอยู่ตลอดเวลา ขึ้นอยู่กับว่าคุณใช้พา ธ อย่างไรคุณอาจต้องหลีกช่องว่างด้วย "\"
Rob

1
@delnan เพื่อความง่ายเรามา จำกัด ขอบเขตของพา ธ เพื่อแยกพา ธ ตัวแปร
MxLDevs

2
@MxyL ปัญหาไม่หายไปเมื่อคุณฮาร์ดโค้ดพา ธ แทนที่จะใช้ตัวแปรสภาพแวดล้อม หากคุณต้องการเส้นทางที่ไม่ระเบิดคุณน่าจะดี หากคุณต้องการเส้นทางที่มีความหมายหรือหากคุณต้องการโต้ตอบกับซอฟต์แวร์อื่น ๆ (หรือความคาดหวังของผู้ใช้ ... ) คุณต้องทำการเรียกการตัดสินตามเส้นทาง

1
@delnan ฉันมุ่งเน้นไปที่การสร้างเส้นทางที่ถูกต้องเป็นหลัก แต่นั่นเป็นจุดที่ดี เส้นทางที่ฉันกำลังเปลี่ยนควรเรียบง่ายพอที่พวกเขาจะมีความหมายด้วยตนเอง
MxLDevs

3
แบ็กสแลชได้รับอนุญาตในชื่อไฟล์บน Linux ดังนั้นการแทนที่แบ็กสแลชในพา ธ Linux อาจเพิ่มไดเรกทอรีที่ไม่ถูกต้อง ตัวอย่างเช่น/foo\\barไม่เทียบเท่ากับ/foo/barบน Linux

คำตอบ:


7

ใช่ ถ้าคุณทำการแทนที่บน Windows เท่านั้นและปิดเมื่อทำงานบนระบบอื่น

การทำการแทนที่บนระบบที่คล้าย Unix นั้นผิดเพราะ\เป็นอักขระที่ถูกต้องในไฟล์หรือชื่อไดเรกทอรีบนแพลตฟอร์มที่คล้าย Unix บนแพลตฟอร์มเหล่านี้เท่านั้นNULและ/ถูกห้ามในชื่อไฟล์และไดเรกทอรี

นอกจากนี้ฟังก์ชัน Windows API บางตัว (ส่วนใหญ่เป็นระดับล่าง) ไม่อนุญาตให้ใช้เครื่องหมายทับซ้าย - ต้องใช้เครื่องหมายแบ็กสแลช


4

ใช่ แต่ทั้งหมดนี้เป็นจุดที่สงสัย Java แปลงสแลชไปข้างหน้าอย่างต่อเนื่องเพื่อแบ็กสแลชบน Windows คุณสามารถใช้ฟอร์เวิร์ดสแลชสำหรับเส้นทางทั้งหมดที่กำหนดค่าตายตัวหรือเก็บไว้ในการกำหนดค่าและจะใช้งานได้กับทั้งสองแพลตฟอร์ม

โดยส่วนตัวฉันมักจะใช้ฟอร์เวิร์ดสแลชแม้กระทั่งบน Windows เพราะไม่ใช่ตัวละครเลี่ยง ไม่ว่าเส้นทางดิบจะอยู่ในรหัสหรือถูกทำให้เป็นภายนอกในไฟล์คุณสมบัติฉันเข้ารหัสมันด้วยวิธีเดียวกัน

ลองมัน! สิ่งนี้จะทำงานใน Windows แน่นอนเปลี่ยนเส้นทางจริงเป็นสิ่งที่มีอยู่และผู้ใช้ของคุณมีสิทธิ์อ่าน

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
หากคุณอ่านคำตอบทั้งหมดของฉันคุณจะเห็นว่าฉันพูดว่าใช้ตัวคั่นไฟล์ Unix เสมอจะทำงานอย่างถูกต้องในทั้งสองสถานที่ไม่จำเป็นต้องมีการแปลง

คำถามระบุว่าไฟล์จะถูกโอนและปล่อยให้เปิดวิธีการจัดเก็บชื่อไฟล์ ฉันเพิ่มความคิดเห็นในคำถามเพื่อขอคำอธิบายในจุดนั้น จากการตอบกลับฉันจะแก้ไขคำตอบของฉันตามความเหมาะสม

มันค่อนข้างไม่น่าเป็นไปได้ว่าโปรแกรมมีอยู่ในรายการของไฟล์ทั้งหมดที่ถูกถ่ายโอนด้วยตนเอง มีความเป็นไปได้อย่างมากที่มีการใช้กลไกอัตโนมัติเพื่อระบุไฟล์ เมื่อกำหนดพารามิเตอร์ของปัญหาตามที่ระบุในคำถามกลไกนี้จะมอบเส้นทางแบบ Windows ดั้งเดิม ในรูปแบบปัจจุบันคำตอบนี้บอก OP เพื่อแก้ปัญหาที่แตกต่างแทนโดยไม่บอกพวกเขาว่าพวกเขาควรจะเปลี่ยนปัญหาให้เป็นปัญหาที่แตกต่างกันอย่างไร
Eliah Kagan

โปรดอ่านความคิดเห็นก่อนหน้าของฉัน

1
Windowsรับรู้ทั้ง fowrard และ backslashes และเป็นเช่นนั้นมาตั้งแต่ต้น MS-DOS เช่นเคอร์เนล Microsoft OS ทุกตัวมีตัวคั่นเครื่องหมายสแลชรองรับ COMMAND.COMล่ามรุ่นแรกมีการตั้งค่าเวลาทำงาน: คุณสามารถกำหนดค่าว่าสแลชที่ล่ามจะใช้สำหรับการพิมพ์และการแยกวิเคราะห์
Kaz

3

ความซับซ้อนอีกประการหนึ่งของ Windows ก็คือมันยังรองรับเครื่องหมาย UNC เช่นเดียวกับตัวอักษรไดรฟ์แบบดั้งเดิม

\\server\sharename\path\filenameไฟล์บนเซิร์ฟเวอร์ไฟล์จากระยะไกลสามารถเข้าถึงได้เป็น


1
ฉันคิดว่านี่เป็นข้อกังวลเดียวที่ยกมาซึ่งเป็นปัญหาสำหรับแอปพลิเคชันนี้ หากมีเส้นทาง UNC ที่เกี่ยวข้องพวกเขาไม่สามารถแปลงเป็นประโยชน์ในเส้นทาง Unix สไตล์
จูลส์

2

เลขที่ มีสิ่งที่ไกลมากขึ้นที่จะคิดเกี่ยวกับมากกว่าเพียงแค่คั่นเส้นทางที่มี (ที่ "\ VS /" สิ่งที่) Rob Y กล่าวถึงมีวิธีการจัดการช่องว่างและความถี่สูงในการใช้งาน Windows มีอักขระที่ผิดกฎหมายต่างกันในสภาพแวดล้อมทั้งสอง มีความตั้งใจของยูนิกซ์ที่จะยอมให้เกือบทุกอย่างเมื่อถูกผู้นำ "\" หลบหนี มีการใช้ Windows ของ '"' เพื่อจัดการกับช่องว่างที่ฝังตัวมีการใช้งาน Windows ของ UCS-16 และการใช้งาน ASCII หรือ UTF-8 ของ Unix

ฯลฯ , ฯลฯ , ฯลฯ

แต่สำหรับแอปพลิเคชันจำนวนมากที่สามารถวางข้อ จำกัด ในชื่อพา ธ ที่พวกเขาต้องการจัดการคุณสามารถทำได้ตามวิธีที่คุณแนะนำ และมันจะทำงานในกรณีอย่างน้อยเป็นจำนวนมากไม่ใช่ทั้งหมด


1
ฉันไม่คิดว่าข้อกังวลเหล่านี้ใช้ได้กับคำถามตามที่ระบุการจัดการพื้นที่เป็นปัญหาส่วนติดต่อผู้ใช้ ระบบ Unix สามารถจัดการช่องว่างในชื่อไฟล์เช่นเดียวกับ Windows ได้ อักขระที่ผิดกฎหมายของ Windows เป็นชุดของตัวยูนิกซ์ ไม่สามารถมีแบ็กสแลชใด ๆ ในชื่อไฟล์ Windows (นอกเหนือจากตัวคั่นไดเรกทอรีซึ่งจะถูกแปลง) การใช้เครื่องหมายคำพูดสำหรับช่องว่างในตัวเป็นข้อกังวลเกี่ยวกับระดับส่วนต่อประสานผู้ใช้ไม่ใช่ปัญหาการจัดการไฟล์ เห็นได้ชัดว่ารหัสการแปลงเป็น Java ดังนั้นควรจัดการ UCS16-> UTF8 conversion โดยอัตโนมัติ
จูลส์

-1

ทุกระบบปฏิบัติการไมโครซอฟท์เริ่มต้นด้วย MS-DOS, มีความเข้าใจในระดับเคอร์เนลทั้งทับและเครื่องหมาย

ดังนั้นบน Windows คุณสามารถแปลงได้อย่างอิสระ ทั้งสองมีสถานะเท่ากันในฐานะตัวคั่นที่สงวนไว้ ในพา ธ ที่ถูกต้องคุณสามารถแทนที่แบ็กสแลชด้วยสแลชและในทางกลับกันได้โดยไม่ต้องเปลี่ยนความหมายเท่าที่เคอร์เนลเกี่ยวข้อง

ในรุ่นแรก ๆ ของ DOS command.comล่ามของ Microsoft ทำให้การตั้งค่าที่กำหนดค่าได้ซึ่งใช้สแลชเพื่อแสดงและแยกพา ธ ในที่สุดก็ถูกลบออก

โปรแกรมพื้นที่ผู้ใช้บางโปรแกรมใน Windows เช่น, โอ้, เชลล์ Windows ( explorer.exe) ไม่ชอบเครื่องหมายสแลช นั่นเป็นเพียงการเขียนโปรแกรมต่ำในโปรแกรมเหล่านั้น


1
แม้ว่าสิ่งนี้จะเป็นจริง แต่ฉันไม่เชื่อว่ามีประโยชน์สำหรับคำถามของ OP ที่ (AIUI) เกี่ยวข้องกับการแปลงชื่อพา ธ ที่มีอยู่ซึ่งจะรวมแบ็กสแลชไว้ในนั้นด้วย มันมีประโยชน์มากสำหรับการเขียนโค้ดข้ามแพลตฟอร์มเพื่อให้ทราบว่าคุณสามารถใช้เครื่องหมายทับซ้ายและให้มันทำงานในบริบทส่วนใหญ่ แต่ในกรณีนี้ฉันไม่คิดว่าจะช่วยได้
จูลส์

@Jules OP กำลังถ่ายโอนไฟล์จาก Windows คำตอบนี้อธิบายว่าไม่มีเครื่องหมายแบ็กสแลชที่จะถูกแทนที่ พวกเขาไม่ได้อยู่ในระบบไฟล์ของ Windows เลย พา ธ ทั้งหมดแสดงได้อย่างชัดเจนด้วยเครื่องหมายสแลช (และ Windows เข้าใจได้)
Kaz
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.