This seems like it should be pretty straight-forward but I cannot figure out how to get a layer object's filepath as a string. Any help is much appreciated. For example:
I have a layer object
var lyr = MapView.Active.Map.GetLayersAsFlattenedList().OfType<FeatureLayer>().First()
I would like to get lyr.Path() or something like that. So that it will return:
Geodatabase feature classes rarely correspond to a single file on disk. If you open up a File Geodatabase using File Explorer, you'll see there's a large number of different files. So there isn't really a path to a feature class.
There is (sometimes) a path to the geodatabase itself.
If the feature class belongs to a file geodatabase (Geodatabase.GetGeodatabaseType() returns GeodatabaseType.LocalDatabase) , the Geodatabase.GetConnector() routine will return a FileGeodatabaseConnectionPath object. This object has a Path property.
There are other kinds of geodatabases, of course, including SDE geodatabases and feature service workspaces. SDE geodatabases may or may not be opened from a .SDE file, but feature service workspaces don't have a file at all, just a URL.
Hope this helps explain why it isn't straightforward!
var gdbPath = lyr.GetTable().GetDatastore().GetPath().ToString();
Is pretty close to what I'm looking for, I am trying to feed it into
To use as a parameter for a tool.
Do you know if passing the string path of a layer into a tool is the best way to go about it?
Yes, we actually added Datastore.GetPath() for use with geoprocessing. Use this and append the table name:
Uri path = geodatabase.GetPath(); string fullPath =Path.Combine(path.LocalPath, TABLE_NAME);
You can simply use it:
var layer = MapView.Active.Map.GetLayersAsFlattenedList().OfType<FeatureLayer>().FirstOrDefault();
var layerPath = await QueuedTask.Run(() => layer.GetPath());