In C# code following IoC standards, should every single IO operation be wrapped within a class handling IO operations? For example, I'm using File.Exists and Directory.Create all over the place -- should I have a class exposing these 2 functions and every single file operation that the whole application uses, to create a layer of abstraction?
What about Path.Combine, or Path.DirectorySeparatorChar, can I use that directly or should I also create wrappers around them?
Returning file info becomes a bit more tricky, I can have a function to return file size, but if I need to access several properties, then I return the FileInfo object -- shouldn't I just rather initialize FileInfo in the code instead of wrapping it?