ডিরেক্টরিটির অস্তিত্ব পরীক্ষা করুন এবং উপস্থিত না থাকলে তৈরি করুন


388

আমি প্রায়শই নিজেকে আর স্ক্রিপ্টগুলি লিখতে দেখি যা প্রচুর আউটপুট উত্পন্ন করে। আমি এই আউটপুটটিকে তার নিজস্ব ডিরেক্টরিতে (গুলি) স্থাপন করা পরিষ্কার মনে করি। আমি নীচে যা লিখেছি তা ডিরেক্টরিটির অস্তিত্বের জন্য যাচাই করবে এবং এতে প্রবেশ করবে, বা ডিরেক্টরিটি তৈরি করবে এবং তারপরে এটি সরাবে। এর কাছে যাওয়ার আরও ভাল উপায় কি আছে?

mainDir <- "c:/path/to/main/dir"
subDir <- "outputDirectory"

if (file.exists(subDir)){
    setwd(file.path(mainDir, subDir))
} else {
    dir.create(file.path(mainDir, subDir))
    setwd(file.path(mainDir, subDir))

}

1
আমি নিশ্চিত যে আমি একটি আর ফাংশন দেখেছি যা এলোমেলোভাবে উত্পাদিত নাম সহ একটি অস্থায়ী ডিরেক্টরি তৈরি করে এবং নামটি ফেরত দেয়। আমি মনে করি এটির মতো একটি রয়েছে যা একটি টেম্প ফাইল তৈরি করে। আমি এগুলি অফহ্যান্ড খুঁজে পাচ্ছি না, তবে ডেটাবেল প্যাকেজ ( cran.r-project.org/web/packages/DatABEL/index.html ) এর একটি ফাংশন get_temporary_file_name রয়েছে।
পলহর্লেয়ুক

42
আপনার setwd()আর আর কোডে কখনও ব্যবহার করা উচিত নয় - এটি মূলত একটি ওয়ার্কিং ডিরেক্টরি ব্যবহার করার ধারণাটিকে পরাস্ত করে কারণ আপনি আর আপনার কম্পিউটারের মধ্যে সহজেই আপনার কোডটি সরিয়ে নিতে পারবেন না।
হ্যাডলি

6
@ হ্যাডলি আকর্ষণীয় বিষয় বিবেচনা করার জন্য, আমি একই পদ্ধতিতে অন্যান্য পদ্ধতিতে আপনার চিন্তা প্রশংসা করব। কর্মক্ষেত্রে, সমস্ত কম্পিউটার একই নেটওয়ার্কে সিঙ্ক হয় তাই ফাইলের পথগুলি সুসংগত। যদি সেগুলি না হয় তবে আমাদের কাছে কোনও স্ক্রিপ্টের বহনযোগ্যতার চেয়ে বড় সমস্যা রয়েছে issues এই বিশেষ উদাহরণে, আমি একটি স্ক্রিপ্ট লিখছিলাম যা এমন একটি মেশিনে লোড করা হবে যা আমাদের জাতীয় উদ্যানগুলিতে 2 বছরের জন্য বহন করা হবে। এই স্ক্রিপ্টটি স্থানীয় এসকিউএল উদাহরণ থেকে ডেটা দখল করবে, কিছু প্রক্রিয়াকরণ করবে এবং একটি .csv স্পিট করবে। শেষ পণ্যটি এমন একটি .batফাইল হবে যা শেষ ব্যবহারকারীকে কখনও সংশোধন করতে হবে না।
চেজ

@ চেস তবে আপনার setwdনেটওয়ার্কের পথগুলির সাথে কাজ করার দরকার নেই । ফলাফলগুলি সংরক্ষণের জন্য আপনাকে কেবলমাত্র পাথ সরবরাহ করতে হবে এবং এখনও চলমান পাথের সাথে কাজ করতে হবে (আর সেশন শুরু হওয়ার সাথে সাথে এটিই প্রতিষ্ঠিত হবে)। অথবা ইচ্ছে কাজ করার ডিরেক্টরি দিয়ে আর।
মারেক

5
হাঁ। বা প্যারামিট্রাইজ out_dir <- "path/to/output/directory"এবং তারপরে ব্যবহার করুন write.table(file = file.path(out_dir,"table_1.csv"), ...)। বা out_file <- function(fnm) file.path("path/to/output/directory", fnm)তারপরেও write.table(file = out_file("table_1.csv"), ...)(নেটওয়ার্ক ড্রাইভের সাথে কাজ করার সময় আমি একই জাতীয় পদ্ধতি ব্যবহার করি)।
মারেক

উত্তর:


403

ব্যবহার showWarnings = FALSE:

dir.create(file.path(mainDir, subDir), showWarnings = FALSE)
setwd(file.path(mainDir, subDir))

dir.create()ডিরেক্টরিটি ইতিমধ্যে উপস্থিত থাকলে ক্রাশ হয় না, এটি কেবল একটি সতর্কতা প্রিন্ট করে। সুতরাং আপনি যদি সতর্কতাগুলি দেখে বেঁচে থাকতে পারেন তবে কেবল এটি করতে সমস্যা নেই:

dir.create(file.path(mainDir, subDir))
setwd(file.path(mainDir, subDir))

58
showWarnings = FALSEএটি ব্যবহার করার সময় সচেতন থাকুন এটি অন্য সতর্কতা যেমন ডিরেক্টরিটি অপ্রমানিতযোগ্য হিসাবে আড়াল করবে।
জেলানিক্স

5
One কেবলমাত্র একটি নির্দিষ্ট সতর্কতা দমন করার কোনও উপায় আছে?
বাস

2
হাই, আমি নেস্টেড ডিরেক্টরি তৈরি করতে চাই, যেমন আমি যদি ফোল্ডার টেস্ট 1 এ থাকি তবে এর ভিতরে এটি টেস্ট 2 এর মধ্যে টেস্ট 3 ... তবে এখনই আমি সমস্যার মুখোমুখি। ডিরেক্টরি 1 না থাকলেও কি আমি 3 স্তরের ডিরেক্টরি তৈরি করতে পারি এমন কোনও উপায় আছে ??
প্রবীণ কেশানী

10
@PraveenKesani এই আপনি যা খুঁজছেন হয়: dir.create("test1/test2/test3/", recursive=TRUE)?
ডিন

6
@ বাসস দেরিতে প্রতিক্রিয়া জানালেও suppressWarnings(<statement>)ঠিক সেই বক্তব্যের জন্য সতর্কতা দমন করবে।
রাম আরএস

163

এপ্রিল 16, 2015 পর্যন্ত, মুক্তির সাথে R 3.2.0একটি নতুন ফাংশন ডেকে আনা হয়েছে dir.exists()। এই ফাংশনটি ব্যবহার করতে এবং ডিরেক্টরিটি উপস্থিত না থাকলে ডিরেক্টরি তৈরি করতে আপনি ব্যবহার করতে পারেন:

ifelse(!dir.exists(file.path(mainDir, subDir)), dir.create(file.path(mainDir, subDir)), FALSE)

FALSEডিরেক্টরিটি ইতিমধ্যে উপস্থিত থাকলে বা অবিরাম ব্যবস্থা থাকলে এবং TRUEএটি উপস্থিত না থাকলেও সফলভাবে তৈরি করা থাকলে এটি ফিরে আসবে ।

নোট করুন যে ডিরেক্টরিটি বিদ্যমান রয়েছে কিনা তা পরীক্ষা করতে আপনি ব্যবহার করতে পারেন

dir.exists(file.path(mainDir, subDir))

9
কেবল নোট ifelse()-ভেক্টরাইজড ব্রাঞ্চিংয়ের জন্য ব্যবহার করা ভাল অনুশীলন নয় তা লক্ষ করুন ।
লিওনেল হেনরি

2
@ বাস কারণ আপনার কোডটি ভ্রান্তভাবে পড়ছে যেন ভেক্টরাইজড কিছু ঘটছে। এটি |স্কেলারের পরিবর্তে ভেক্টরাইজড ব্যবহার করার মতো ||। এটি কাজ করে তবে খারাপ অনুশীলন।
লিওনেল হেনরি

1
ওহে অভিশাপ, তাই আমি যদি আমার বক্তব্যগুলিও ভুলভাবে ব্যবহার করে ভুল করে যাচ্ছি তবে |ভেক্টরাইজেশন কি ||কখনও কখনও এটির সাথে কাজ করে না ? আমি জানি এটি বিষয় ছাড়াই তবে আমি এটি জানতে খুব আগ্রহী। আমি যেতে ডিফো করব এবং ভেক্টরাইজেশন সম্পর্কে আরও পড়ব। ধন্যবাদ
বাস

4
সুতরাং এটি করার সর্বোত্তম অনুশীলনের উপায়টি যদি আমাদের এড়ানো উচিত ifelse?
কিলারনেল

6
যদি অন্য কোনও ব্যবহার করে;)
লিওনেল হেনরি

17

সাধারণ আর্কিটেকচারের ক্ষেত্রে আমি ডিরেক্টরি তৈরির ক্ষেত্রে নিম্নলিখিত কাঠামোর সুপারিশ করব। এটি বেশিরভাগ সম্ভাব্য সমস্যাগুলি কভার করবে এবং ডিরেক্টরি তৈরির সাথে অন্য কোনও সমস্যা dir.createকল দ্বারা সনাক্ত করা হবে ।

mainDir <- "~"
subDir <- "outputDirectory"

if (file.exists(paste(mainDir, subDir, "/", sep = "/", collapse = "/"))) {
    cat("subDir exists in mainDir and is a directory")
} else if (file.exists(paste(mainDir, subDir, sep = "/", collapse = "/"))) {
    cat("subDir exists in mainDir but is a file")
    # you will probably want to handle this separately
} else {
    cat("subDir does not exist in mainDir - creating")
    dir.create(file.path(mainDir, subDir))
}

if (file.exists(paste(mainDir, subDir, "/", sep = "/", collapse = "/"))) {
    # By this point, the directory either existed or has been successfully created
    setwd(file.path(mainDir, subDir))
} else {
    cat("subDir does not exist")
    # Handle this error as appropriate
}

এছাড়াও সচেতন হন যে যদি ~/fooউপস্থিত না থাকে তবে কলটি dir.create('~/foo/bar')নির্দিষ্ট না করা ব্যর্থ হবে recursive = TRUE


3
আপনি পেস্ট (...) বনাম ফাইল.পাথ (মেইনডির, সাবডির) ব্যবহার করার কোনও কারণ আছে কি? এছাড়াও যদি আপনি <- file.path (mainDir, subDir) কোনও পাথ করেন তবে আপনি বিবৃতিটি আরও পঠনযোগ্য করে তুলতে 5 বার এটি পুনরায় ব্যবহার করতে পারেন।
মাইকএফ

14

এখানে সহজ চেক , এবং যদি বিদ্যমান নয় Dir তৈরি করে:

## Provide the dir name(i.e sub dir) that you want to create under main dir:
output_dir <- file.path(main_dir, sub_dir)

if (!dir.exists(output_dir)){
dir.create(output_dir)
} else {
    print("Dir already exists!")
}

9

ডিরেক্টরিটির অস্তিত্বের জন্য পরীক্ষা করার জন্য file.exists () ব্যবহার করা মূল পোস্টে একটি সমস্যা। যদি সাবডির একটি বিদ্যমান ফাইলের নাম অন্তর্ভুক্ত করে (কেবল একটি পাথের পরিবর্তে), ফাইল.এক্সিস্টগুলি () সত্য ফিরে আসবে, তবে সেটডউইড () এ কলটি ব্যর্থ হবে কারণ আপনি একটি ডিরেক্টরিতে কার্য ডিরেক্টরিকে নির্দেশ করতে পারবেন না can't

আমি ফাইল_স্টেস্ট (অপ = "- ডি", সাবডির) ব্যবহারের সুপারিশ করব যা সাবডির একটি বিদ্যমান ডিরেক্টরি হলে "সত্য" প্রত্যাবর্তন করবে তবে সাবডির যদি বিদ্যমান ফাইল বা অস্তিত্বহীন ফাইল বা ডিরেক্টরি থাকে তবে ফলস। একইভাবে, কোনও ফাইলের জন্য পরীক্ষা করা ওপ = "- এফ" দিয়ে সম্পন্ন করা যায়।

অতিরিক্ত হিসাবে, অন্য মন্তব্যে বর্ণিত হিসাবে, কার্যকরী ডিরেক্টরিটি আর পরিবেশের অংশ এবং এটি কোনও স্ক্রিপ্ট নয়, ব্যবহারকারী দ্বারা নিয়ন্ত্রণ করা উচিত। স্ক্রিপ্টগুলির উচিত আদর্শভাবে আর পরিবেশ পরিবর্তন করা উচিত নয়। এই সমস্যাটির সমাধানের জন্য, আমি বিশ্বব্যাপী উপলব্ধ ডিরেক্টরি সঞ্চয় করতে বিকল্পগুলি () ব্যবহার করতে পারি যেখানে আমি আমার সমস্ত আউটপুট চেয়েছিলাম wanted

সুতরাং, নিম্নলিখিত সমাধানটি বিবেচনা করুন, যেখানে কিছু ইউনিক ট্যাগ বিকল্প নামের জন্য কেবলমাত্র একটি প্রোগ্রামার-সংজ্ঞায়িত উপসর্গ, এটি একই নামের একটি বিকল্প ইতিমধ্যে উপস্থিত থাকার সম্ভাবনা কমিয়ে দেয়। (উদাহরণস্বরূপ, আপনি যদি "ফাইলার" নামে পরিচিত একটি প্যাকেজ বিকাশ করছিলেন তবে আপনি ফাইলআরমেইনডায়ার এবং ফাইলআরএসবডির ব্যবহার করতে পারেন)।

নিম্নলিখিত কোডটি অন্যান্য স্ক্রিপ্টগুলিতে পরে ব্যবহারের জন্য উপলব্ধ বিকল্পগুলি সেট করতে ব্যবহার করা হবে (সুতরাং কোনও স্ক্রিপ্টে সেটডউইডের ব্যবহার এড়ানো) এবং প্রয়োজনে ফোল্ডারটি তৈরি করতে:

mainDir = "c:/path/to/main/dir"
subDir = "outputDirectory"

options(someUniqueTag.mainDir = mainDir)
options(someUniqueTag.subDir = "subDir")

if (!file_test("-d", file.path(mainDir, subDir)){
  if(file_test("-f", file.path(mainDir, subDir)) {
    stop("Path can't be created because a file with that name already exists.")
  } else {
    dir.create(file.path(mainDir, subDir))
  }
}

তারপরে, পরবর্তী কোনও স্ক্রিপ্টে যা সাবডিরের মধ্যে একটি ফাইল ম্যানিপুলেট করার দরকার ছিল, আপনি এর মতো কিছু ব্যবহার করতে পারেন:

mainDir = getOption(someUniqueTag.mainDir)
subDir = getOption(someUniqueTag.subDir)
filename = "fileToBeCreated.txt"
file.create(file.path(mainDir, subDir, filename))

এই দ্রবণটি কার্যকরী ডিরেক্টরিটিকে ব্যবহারকারীর নিয়ন্ত্রণে রাখে।


8

আমি আর 2.15.3 এর সাথে একটি সমস্যা পেয়েছি যার দ্বারা ভাগ করে নেওয়া নেটওয়ার্ক ড্রাইভে পুনরাবৃত্তভাবে একটি গাছের কাঠামো তৈরি করার চেষ্টা করার সময় আমি একটি অনুমতি ত্রুটি পেয়ে যাব।

এই বিজোড়তা কাছাকাছি পেতে আমি নিজেই কাঠামো তৈরি করি;

mkdirs <- function(fp) {
    if(!file.exists(fp)) {
        mkdirs(dirname(fp))
        dir.create(fp)
    }
} 

mkdirs("H:/foo/bar")

5

এক রৈখিক:

if (!dir.exists(output_dir)) {dir.create(output_dir)}

উদাহরণ:

dateDIR <- as.character(Sys.Date())
outputDIR <- file.path(outD, dateDIR)
if (!dir.exists(outputDIR)) {dir.create(outputDIR)}

2

কোনও পথ কোনও বৈধ ডিরেক্টরি কিনা তা জানার জন্য চেষ্টা করুন:

file.info(cacheDir)[1,"isdir"]

file.info শেষের দিকে স্ল্যাশ সম্পর্কে চিন্তা করে না।

file.existsউইন্ডোজে কোনও ডিরেক্টরিতে এটি ব্যর্থ হবে যদি এটি স্ল্যাশে শেষ হয় এবং এটি ব্যতীত সফল হয়। সুতরাং এটি কোনও পাথ ডিরেক্টরি কিনা তা নির্ধারণ করতে ব্যবহার করা যাবে না।

file.exists("R:/data/CCAM/CCAMC160b_echam5_A2-ct-uf.-5t05N.190to240E_level1000/cache/")
[1] FALSE

file.exists("R:/data/CCAM/CCAMC160b_echam5_A2-ct-uf.-5t05N.190to240E_level1000/cache")
[1] TRUE

file.info(cacheDir)["isdir"]

এই উত্তর সম্পর্কে কী ভুল (অংশটি অন্তর্ভুক্ত না করে dir.create())? বিবৃতিগুলি ভুল বা কেবল হাতে প্রশ্নটি সমাধানে সহায়ক নয় বলে বিবেচিত?
মিসচিলি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.