5

At the moment I'm using >

filename = FileNameJoin[{root = "F:\\somefolderpath", file = "somefile.extention"}];
If[! DirectoryQ[root], 
  Print[Style["Directory '" <> root <> "' does not exist!", {Red, Bold, Large}]]; Quit[]];
If[! FileExistsQ[filename], 
  Print[Style["File '" <> filename <> "' does not exist!", {Red, Bold, Large}]]; Quit[]];
(*Start using 'filename'*)

edit: Ended up using

SafeFile::usage = "Use instead of Import.";
SafeFile::nodir = "Directory `1` does not exist.";
SafeFile::nofile = "File `1` does not exist.";
SafeFile[filename_,root_:NotebookDirectory[]]:=Module[{
    fullfilename=FileNameJoin[{root,filename}]
},
    If[!TrueQ@DirectoryQ@root,Message[SafeFile::nodir,root];Quit[]];
    If[!TrueQ@FileExistsQ@fullfilename,Message[SafeFile::nofile,filename];Quit[]];
    Import[fullfilename]
]

Quitting kernel was actually what I needed.

Margus
  • 1,987
  • 2
  • 15
  • 19

2 Answers2

12

You might consider using Messages instead of Print. You should also consider using TrueQ if either root or filename might not be a string.

file::nodir = "Directory `1` does not exist.";
file::nofile = "File `1` does not exist.";

If[! TrueQ @ DirectoryQ @ root, Message[file::nodir, root]; Abort[]];
If[! TrueQ @ FileExistsQ @ filename, Message[file::nofile, filename]; Abort[]];
Mr.Wizard
  • 271,378
  • 34
  • 587
  • 1,371
7

What you are doing seems pretty minimal already; the fact that MMA notation is very verbose is something that cannot be avoided. You could separate the whole check into a separate function and put that into an invisible initialization cell so it is out of the way.

As for not killing the kernel, just use Abort[] instead of Quit[].

Mr.Wizard
  • 271,378
  • 34
  • 587
  • 1,371
Timo
  • 835
  • 7
  • 11