OS independent file paths & Utility.PathCombine added

System.IO.Path.Combine provides cross-platform support for system paths, however rooted paths discarding of earlier segments
Utilities.PathCombine ensures if any parameters start with root chacters does not discard previous Utilities.PathCombine allows appending of "\\" to translate to the correct cross-platform result
This commit is contained in:
Sean Long 2020-04-18 14:57:31 -04:00
parent 194f5674b4
commit f0043f53ee
11 changed files with 37 additions and 18 deletions

View File

@ -44,7 +44,7 @@ namespace Oqtane.Services
{
if (!(folderPath.EndsWith(System.IO.Path.DirectorySeparatorChar) || folderPath.EndsWith(System.IO.Path.AltDirectorySeparatorChar)))
{
folderPath = System.IO.Path.Combine(folderPath, " ").TrimEnd(' ');
folderPath = Utilities.PathCombine(folderPath,"\\");
}
var path = WebUtility.UrlEncode(folderPath);

View File

@ -40,7 +40,7 @@ namespace Oqtane.Services
{
if (!(folderPath.EndsWith(System.IO.Path.DirectorySeparatorChar) || folderPath.EndsWith(System.IO.Path.AltDirectorySeparatorChar)))
{
folderPath = System.IO.Path.Combine(folderPath, " ").TrimEnd(' ');
folderPath = Utilities.PathCombine(folderPath, "\\");
}
var path = WebUtility.UrlEncode(folderPath);

View File

@ -431,12 +431,12 @@ namespace Oqtane.Controllers
private string GetFolderPath(Folder folder)
{
return Path.Combine(_environment.ContentRootPath, "Content", "Tenants", _tenants.GetTenant().TenantId.ToString(), "Sites", folder.SiteId.ToString(), folder.Path, " ").TrimEnd(' ');
return Utilities.PathCombine(_environment.ContentRootPath, "Content", "Tenants", _tenants.GetTenant().TenantId.ToString(), "Sites", folder.SiteId.ToString(), folder.Path);
}
private string GetFolderPath(string folder)
{
return Path.Combine(_environment.WebRootPath, folder, " ").TrimEnd(' ');
return Utilities.PathCombine(_environment.WebRootPath, folder);
}
private void CreateDirectory(string folderpath)
@ -448,7 +448,7 @@ namespace Oqtane.Controllers
string[] folders = folderpath.Split(separators, StringSplitOptions.RemoveEmptyEntries);
foreach (string folder in folders)
{
path = Path.Combine(path, folder);
path = Utilities.PathCombine(path, folder,"\\");
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);

View File

@ -110,7 +110,7 @@ namespace Oqtane.Controllers
if (string.IsNullOrEmpty(folder.Path) && folder.ParentId != null)
{
Folder parent = _folders.GetFolder(folder.ParentId.Value);
folder.Path = Path.Combine(parent.Path, folder.Name);
folder.Path = Utilities.PathCombine(parent.Path, folder.Name,"\\");
}
folder = _folders.AddFolder(folder);
_logger.Log(LogLevel.Information, this, LogFunction.Create, "Folder Added {Folder}", folder);
@ -135,7 +135,7 @@ namespace Oqtane.Controllers
if (string.IsNullOrEmpty(folder.Path) && folder.ParentId != null)
{
Folder parent = _folders.GetFolder(folder.ParentId.Value);
folder.Path = Path.Combine(parent.Path, folder.Name);
folder.Path = Utilities.PathCombine(parent.Path, folder.Name,"\\");
}
folder = _folders.UpdateFolder(folder);
_logger.Log(LogLevel.Information, this, LogFunction.Update, "Folder Updated {Folder}", folder);

View File

@ -189,17 +189,17 @@ namespace Oqtane.Controllers
{
string rootPath;
DirectoryInfo rootFolder = Directory.GetParent(_environment.ContentRootPath);
string templatePath = Path.Combine(rootFolder.FullName, "Oqtane.Client", "Modules", "Admin", "ModuleCreator", "Templates",moduleDefinition.Template," ").TrimEnd(' ');
string templatePath = Utilities.PathCombine(rootFolder.FullName, "Oqtane.Client", "Modules", "Admin", "ModuleCreator", "Templates",moduleDefinition.Template,"\\");
if (moduleDefinition.Template == "internal")
{
rootPath = rootFolder.FullName;
rootPath = Utilities.PathCombine(rootFolder.FullName,"\\");
moduleDefinition.ModuleDefinitionName = moduleDefinition.Owner + "." + moduleDefinition.Name + "s.Modules, Oqtane.Client";
moduleDefinition.ServerManagerType = moduleDefinition.Owner + "." + moduleDefinition.Name + "s.Manager." + moduleDefinition.Name + "Manager, Oqtane.Server";
}
else
{
rootPath = Path.Combine(rootFolder.Parent.FullName , moduleDefinition.Owner + "." + moduleDefinition.Name + "s.Module");
rootPath = Utilities.PathCombine(rootFolder.Parent.FullName , moduleDefinition.Owner + "." + moduleDefinition.Name + "s.Module","\\");
moduleDefinition.ModuleDefinitionName = moduleDefinition.Owner + "." + moduleDefinition.Name + "s.Modules, " + moduleDefinition.Owner + "." + moduleDefinition.Name + "s.Module.Client";
moduleDefinition.ServerManagerType = moduleDefinition.Owner + "." + moduleDefinition.Name + "s.Manager." + moduleDefinition.Name + "Manager, " + moduleDefinition.Owner + "." + moduleDefinition.Name + "s.Module.Server";
}
@ -218,7 +218,7 @@ namespace Oqtane.Controllers
private void ProcessTemplatesRecursively(DirectoryInfo current, string rootPath, string rootFolder, string templatePath, ModuleDefinition moduleDefinition)
{
// process folder
string folderPath = Path.Combine(rootPath, current.FullName.Replace(templatePath, ""));
string folderPath = Utilities.PathCombine(rootPath, current.FullName.Replace(templatePath, ""));
folderPath = folderPath.Replace("[Owner]", moduleDefinition.Owner);
folderPath = folderPath.Replace("[Module]", moduleDefinition.Name);
if (!Directory.Exists(folderPath))

View File

@ -150,7 +150,7 @@ namespace Oqtane.Controllers
}
// add folder for user
Folder folder = _folders.GetFolder(user.SiteId, "Users");
Folder folder = _folders.GetFolder(user.SiteId, Utilities.PathCombine("Users","\\"));
if (folder != null)
{
_folders.AddFolder(new Folder
@ -158,7 +158,7 @@ namespace Oqtane.Controllers
SiteId = folder.SiteId,
ParentId = folder.FolderId,
Name = "My Folder",
Path = System.IO.Path.Combine(folder.Path, newUser.UserId.ToString()),
Path = Utilities.PathCombine(folder.Path, newUser.UserId.ToString(),"\\"),
Order = 1,
IsSystem = true,
Permissions = "[{\"PermissionName\":\"Browse\",\"Permissions\":\"[" + newUser.UserId.ToString() + "]\"},{\"PermissionName\":\"View\",\"Permissions\":\"All Users\"},{\"PermissionName\":\"Edit\",\"Permissions\":\"[" +

View File

@ -387,14 +387,14 @@ namespace Oqtane.Infrastructure
}
// add folder for user
var folder = folderRepository.GetFolder(user.SiteId, "Users");
var folder = folderRepository.GetFolder(user.SiteId, Utilities.PathCombine("Users","\\"));
if (folder != null)
folderRepository.AddFolder(new Folder
{
SiteId = folder.SiteId,
ParentId = folder.FolderId,
Name = "My Folder",
Path = Path.Combine(folder.Path, newUser.UserId.ToString()),
Path = Utilities.PathCombine(folder.Path, newUser.UserId.ToString(),"\\"),
Order = 1,
IsSystem = true,
Permissions = new List<Permission>

View File

@ -103,7 +103,8 @@ namespace Oqtane.Infrastructure
case ".svg":
case ".js":
case ".css":
filename = Path.Combine(sourceFolder, entry.FullName.Replace("wwwroot", name));
string entryPath = Utilities.PathCombine(entry.FullName.Replace("wwwroot", name).Split('/'));
filename = Path.Combine(sourceFolder, entryPath);
if (!Directory.Exists(Path.GetDirectoryName(filename)))
{
Directory.CreateDirectory(Path.GetDirectoryName(filename));

View File

@ -134,7 +134,7 @@ namespace Oqtane.SiteTemplates
if (System.IO.File.Exists(Path.Combine(_environment.WebRootPath, "images", "logo.png")))
{
string folderpath = Path.Combine(_environment.ContentRootPath, "Content", "Tenants", site.TenantId.ToString(), "Sites", site.SiteId.ToString());
string folderpath = Utilities.PathCombine(_environment.ContentRootPath, "Content", "Tenants", site.TenantId.ToString(), "Sites", site.SiteId.ToString(),"\\");
System.IO.Directory.CreateDirectory(folderpath);
if (!System.IO.File.Exists(Path.Combine(folderpath, "logo.png")))
{

View File

@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using Microsoft.EntityFrameworkCore;
@ -583,7 +584,7 @@ namespace Oqtane.Repository
});
_folderRepository.AddFolder(new Folder
{
SiteId = site.SiteId, ParentId = folder.FolderId, Name = "Users", Path = "Users", Order = 1, IsSystem = true,
SiteId = site.SiteId, ParentId = folder.FolderId, Name = "Users", Path = Utilities.PathCombine("Users","\\"), Order = 1, IsSystem = true,
Permissions = "[{\"PermissionName\":\"Browse\",\"Permissions\":\"Administrators\"},{\"PermissionName\":\"View\",\"Permissions\":\"Administrators\"},{\"PermissionName\":\"Edit\",\"Permissions\":\"Administrators\"}]"
});

View File

@ -1,5 +1,6 @@
using System;
using System.Globalization;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
@ -236,5 +237,21 @@ namespace Oqtane.Shared
@"(?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9a-z][-0-9a-z]*[0-9a-z]*\.)+[a-z0-9][\-a-z0-9]{0,22}[a-z0-9]))$",
RegexOptions.IgnoreCase, TimeSpan.FromMilliseconds(250));
}
public static string PathCombine(params string[] segments)
{
var separators = new char[] { Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar };
for (int i =1;i < segments.Length; i++){
if(Path.IsPathRooted(segments[i])){
segments[i] = segments[i].TrimStart(separators);
if(String.IsNullOrEmpty(segments[i])){
segments[i]=" ";
}
}
}
return Path.Combine(segments).TrimEnd();
}
}
}