I need to get the main project working directory, for example I have a project folder structure like,
Projectmainfolder->
SourceCodeFolder
AnotherFolder
I have my all code files in sourceCodeFolder, and now I want to get or print Projectmainfolder path, Kindly let me know if there is a way to get the location path of the root project folder.
This will give you the path to the current file.
__FILE__
In order to expand a relative path, do this:
File.expand_path("../../", __FILE__)
if you start your script from the Projectmainfolder directory, Dir.getwd should print you the path you want. Or did you mean something different?
Related
I am trying to write some data in one Ruby file to a file in another folder but I am having trouble identifying the path to get to the file I want to write to.
My current code is:
File.write('../csv_fixtures/loans.csv', 'test worked!')
And my folder structure is as follows:
Where I am trying to run my code in 'run_spec.rb' and write to 'loans.csv'.
Additionally, this is the error I am getting:
Give the path relative to the working directory, not the file that you call File.write from. The working directory is the place you've navigated to through cd before calling the ruby code. If you ran rspec from the root of your project, then the working directory will also be the root. So, in this case, it looks like it would be ./spec/csv_fixtures/loans.csv. You can run puts Dir.pwd to see the working directory that all paths should be relative to.
If you wanted to something more like require_relative, you have to use some sort of workaround to turn it into an absolute path, such as File.dirname(__FILE__) which gives the absolute path of the folder containing the current file:
path = File.join(File.dirname(__FILE__, "../csv_fixtures/loans.csv"))
Ok so with siriproxy it my lib folder along with the rb file for the plugin I have created a myconfig.yml file so I can change certain settings by writing to that file.
I have been able to write to the file but only if I include the full path all the way from the home directory down.
But is there not a way to open the file from the same directory i am in? I have tried every path combination I can think of.
There has to be one i am missing
If you use the following in your ruby file, you should get the absolute path where it is
File.expand_path(__FILE__)
From doc __FILE__
The name of the file currently being executed, including path relative to the directory where the application was started up (or the current directory, if it has been changed)
From doc File.expand_path
Converts a pathname to an absolute pathname.
As you probably want the directory, you should use File.dirname(__FILE__), so the path of your file myconfig.yml should be obtained with
File.join(File.expand_path(File.dirname(__FILE__)), 'myconfig.yml')
In more recent Ruby (>=2.0.0), you can use __dir__ (from Archonic's comment):
Returns the canonicalized absolute path of the directory of the file from which this method is called. It means symlinks in the path is resolved. If FILE is nil, it returns nil. The return value equals to File.dirname(File.realpath(FILE)).
Here I am creating the logs folder under the current path of the directory using Dir::pwd. But I want to change this to pick the directory path from config files which will run in any other machines.
date_directory= "#{Dir::pwd}/logs/#{DateHelper.getDirectoryYearStamp}/#{DateHelper.getDirectoryMonthStamp}/#{DateHelper.getDirectoryDateStamp}/"
FileUtils.mkdir_p(date_directory) unless Dir.exists?(date_directory)
I tired with giving the absolute path and it works. But how do I make the directory by passing the relative path?
You are allready using a relative path, so is is generic solution, the subfolder of your current folder is a relative position. Is the code you published working ? But inside your question you mention config files, is it that what you want ? What kind of file ? a yaml, ini or of a simple text file ?
If a simple textfile you can do with
path = File.read("#{File.dirname(__FILE__)}/path.txt")
EDIT: based on your comment, the following snippets wil create a logfile a day in the /some/x/y/z
folder.
require 'logger'
$log = Logger.new("/some/x/y/z/logs.txt", 'daily' )
$log.info "teststring"
gives in the file "C:\some\x\y\z\logs.txt"
# Logfile created on 2013-04-05 13:17:27 +0200 by logger.rb/31641
I, [2013-04-05T13:20:19.811837 #3300] INFO -- : teststring
I'm making a gem for internal use. In it, I load some YAML from another directory:
# in <project_root>/bin/magicwand
MagicWand::Configuration::Initializer.new(...)
# in <project_root>/lib/magicwand/configuration/initializer.rb
root_yaml = YAML.load_file(
File.expand_path("../../../../data/#{RootFileName}", __FILE__))
# in <project_root>/data/root.yaml
---
apple: 100
banana: 200
coconut: 300
I'd rather not depend on the location of data/root.yaml relative to initializer.rb. Instead, I'd rather get a reference to <project_root> and depend on the relative path from there, which seems like a smarter move.
First, is that the best way to go about this? Second, if so, how do I do that? I checked out the various File methods, but I don't think there's anything like that. I'm using Ruby 1.9.
Right now, I create a special constant and depend on that instead:
# in lib/magicwand/magicwand.rb
module MagicWand
# Project root directory.
ROOT = File.expand_path("../..", __FILE__)
end
but I'm not sure I like that approach either.
If there's a main file you always run you can use that file as a reference point. The relative path (between the current directory and) of that file will be in $0, so to get the relative path to data/root.yaml (assuming that is the relative path between the main file and root.yaml) you do
path_to_root_yaml = File.dirname($0) + '/data/root.yaml'
So I want to make a file path relative to the directory it is in, in Ruby.
I have a project, and I want it to be able to find the file no matter what directory the project is unzipped into. (Say the code is run on different machines, for example) I can't figure it out for the life of me.
It seems for requires that I can do this:
require File.dirname(__FILE__) + '/comparison'
What can I do for a file that is in a different directory than my src folder?
Instead of listing,
file = 'C:/whole path/long/very_long/file.txt'
I'd like to say:
file = 'file.txt'
or
file = File.helpful_method + 'file.txt'
file = File.join(File.dirname(__FILE__), '..', 'another_dir', 'file.txt')
Replace '..', 'another_dir' with the relative path segments that reach 'file.txt'.
If you're running Ruby 1.9.2 or later, you can use require_relative instead:
require_relative '../somewhere/file.rb'
This doesn't solve the general problem of referring to files by their relative path, but if all you're doing is requiring the file, it should work.