DayPath Journal

Songhay System: the conventional way to derive a file location…

In general-purpose programming frameworks there is often not one “right” way of doing things—which can be another way of saying: we can make our own conventions. Today I am putting in writing the conventional way to derive a file “path” from a declared location:

  • Verify that the declared location is not null or empty.
  • Verify that the declared location exists. When the path exists there is no need to derive a path. End.
  • When the path does not exist—and the declared location is a relative path—then attempt to derive the location based on the present working directory of a specified assembly.
  • Verify that the derived location exists.

Here is a C# sketch:

traceSource.TraceVerbose("looking for file: {0}...", myPath);
if (!File.Exists(myPath))
{
    var dll = Assembly.GetEntryAssembly();
    myPath = FrameworkAssemblyUtility.GetPathFromAssembly(dll, myPath);
    traceSource.TraceVerbose("looking for file (again): {0}...", myPath);
}
if (!File.Exists(myPath)) throw new FileNotFoundException("The expected file is not here.");
    

Where FrameworkAssemblyUtility.GetPathFromAssembly() method is part of my SonghayCore source code on GitHub. It may help to mention that this utility method supports relative paths like this:

..\..\foo\bar\my-file.json
    

…as well as the typical ones like this:

\foo\bar\my-file.json
    

…and the ‘properly-formatted’ ones like this:

foo\bar\my-file.json
    

The parent directory characters (..\) are telling my utility method to move to the parent directory of the targeted assembly.

Also, should a non-relative path (a rooted path) be passed to FrameworkAssemblyUtility.GetPathFromAssembly(), an exception will be thrown so this will not work:

c:\foo\bar\my-file.json
    

By the way, I’ve noticed that paths like this actually work in Windows:

c:\foo\bar\..\..\parent\my-file.json
    

…as long as there is a folder called \parent two directories above \bar. I assume this must have come to Windows sometime after Windows NT. My code currently does not support this format.