2014-09-26 202 views
4

我正在编写一个应用程序在C#中编译并在Windows下运行,但它将部分负责上载文件到文件夹结构上Linux服务器。在我的Windows应用程序中,我希望能够轻松地将Linux目录和文件名与Path.Combine结合在一起。有没有办法用不同的路径分隔符来暂时覆盖Path.Combine?使用Path.Combine()在Windows系统上形成一个Linux路径

+1

你可以只包了'Path.Combine()'调用和添加一个'Replace'到结果。 – 2014-09-26 19:49:00

+1

你知道Windows和Linux路径之间有更多的区别,而不仅仅是分隔符,对吗? – hvd 2014-09-26 20:00:31

+0

对于本地路径,窗口将同时接受'/'和'''''。这当然不适用于网络路径。 – paqogomez 2014-09-26 20:02:30

回答

2

你应该做的是创建samba共享目录。

这样你就可以像访问windows网络路径一样访问它。

var path = @"\\"+linuxHostname + @"\sambaShare\"; 

但是,为了回答你的问题,你不能改变Path.Combine斜线..也许一个字符串替换会做什么?

var linuxPath = winPath.Replace('\\','/'); 
1

如果你只是想结合,有我的解决方案

public static string PathCombine(string pathBase, char separator = '/', params string[] paths) 
{ 
    if (paths == null || !paths.Any()) 
     return pathBase; 

    #region Remove path end slash 
    var slash = new[] { '/', '\\' }; 
    Action<StringBuilder> removeLastSlash = null; 
    removeLastSlash = (sb) => 
    { 
     if (sb.Length == 0) return; 
     if (!slash.Contains(sb[sb.Length - 1])) return; 
     sb.Remove(sb.Length - 1, 1); 
     removeLastSlash(sb); 
    }; 
    #endregion Remove path end slash 

    #region Combine 
    var pathSb = new StringBuilder(); 
    pathSb.Append(pathBase); 
    removeLastSlash(pathSb); 
    foreach (var path in paths) 
    { 
     pathSb.Append(separator); 
     pathSb.Append(path); 
     removeLastSlash(pathSb); 
    } 
    #endregion Combine 

    #region Append slash if last path contains 
    if (slash.Contains(paths.Last().Last())) 
     pathSb.Append(separator); 
    #endregion Append slash if last path contains 

    return pathSb.ToString(); 
} 

有了这个,你可以调用

PathCombine("/path", paths: new[]{"to", "file.txt"}); 
// return "/path/to/file.txt" 
PathCombine(@"\\path", '\\', "to", "file.txt"); 
// return @"\\path\to\file.txt" 
PathCombine("/some/bin:paths/bin", ':', "/another/path", "/more/path"); 
// return "/some/bin:paths/bin:/another/path:/more/path" 
相关问题