วิธีตรวจสอบว่ามีไดเร็กทอรีในทับทิมหรือไม่


163

ฉันกำลังพยายามเขียนสคริปต์ซึ่งจะตรวจสอบหรืออัปเดต URL การโค่นล้มโดยอัตโนมัติตามว่ามีไดเรกทอรีที่ระบุอยู่หรือไม่

ด้วยเหตุผลบางอย่างรหัสของฉันไม่ทำงานและคืนค่าจริงเสมอแม้ว่าจะเป็นเท็จ:

def directory_exists?(directory)
  return false if Dir[directory] == nil
  true
end

ผมทำอะไรผิดหรือเปล่า?

คำตอบ:


287

ถ้ามันเป็นเรื่องสำคัญไม่ว่าจะเป็นไฟล์ที่คุณกำลังมองหาเป็นไดเรกทอรีและไม่เพียง แต่ไฟล์ที่คุณสามารถใช้หรือFile.directory? Dir.exist?สิ่งนี้จะคืนค่าจริงหากไฟล์นั้นมีอยู่และเป็นไดเรกทอรี

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

def directory_exists?(directory)
  File.directory?(directory)
end

โปรดทราบว่าการใช้วิธีการไม่จำเป็นในกรณีปัจจุบัน


139
ทำไมถึงต้องวางไว้ในวิธีอื่น? เพียงแค่เรียกมันโดยตรง!
ไรอัน Bigg

11
@Radar ฉันคิดว่าวิธีการถอด - ลงน่าจะง่ายขึ้นสำหรับวัตถุประสงค์ของคำถามและวิธีการที่แท้จริงอาจมีตรรกะเพิ่มเติมบางอย่าง หากไม่มีเหตุผลอื่นที่จำเป็นต้องดำเนินการในวิธีการฉันเห็นด้วย โดยทั้งหมดเพียงแค่เรียกใช้ไดเรกทอรีหรือไม่ โดยตรง.
Emily

4
จะไม่Dir.exists?สะอาดกว่าFile.directory?หรือ?
Yo Ludke

3
Dir.exists?เลิกใช้แล้ว, ใช้งานDir.exist
fkoessler

4
@ การเผาไหม้ที่ไม่ดีของฉันมันDir.exist?
fkoessler

42

คุณยังสามารถใช้Dir::exist?เช่น:

Dir.exist?('Directory Name')

ส่งคืนtrueหาก 'ชื่อไดเรกทอรี' เป็นไดเรกทอรีfalseมิฉะนั้น 1


2
ดูเหมือนว่าจะต้องใช้ Ruby> 1.9 หรือมากกว่านั้นเมื่อวันที่ 1.8 มันจะกลับundefined method `exists?' for Dir:Class (NoMethodError)มา นอกจากนี้รูปแบบพหูพจน์จะเลิกใช้ใช้.exist?แทน
Josip Rodin

40

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

File.exists? '~/exists'
=> false
File.directory? '~/exists'
=> false
File.exists? File.expand_path('~/exists')
=> true

18
File.exist?("directory")

Dir[]nilส่งกลับอาร์เรย์ดังนั้นมันจะไม่เป็น หากคุณต้องการทำในแบบของคุณคุณสามารถทำได้

Dir["directory"].empty?

ซึ่งจะกลับมาtrueหากไม่พบ


7

คุณสามารถใช้Kernel#test:

test ?d, 'some directory'

มันได้มาจากต้นกำเนิดจากhttps://ss64.com/bash/test.html คุณจะสังเกตเห็นว่า bash testมีการตั้งค่าสถานะนี้-dเพื่อทดสอบว่ามีไดเรกทอรีอยู่หรือไม่ -d file True if file is a Directory. [[ -d demofile ]]


1
นี่มันเรียบร้อย ไม่ใช่การแสดงออกที่รวดเร็วที่สุดแต่ก็เรียบร้อย
kayleeFrye_onDeck
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.