//ディレクトリ変更 public bool Cwd(string paramStr) { //失敗した場合、移動しない var keepCurrent = _current; var keepOneMount = _oneMount; //絶対パス指定の場合、いったんルートまで戻る if (paramStr[0] == '/') { if (!Cwd1("/")) { _current = keepCurrent; _oneMount = keepOneMount; return(false); } paramStr = paramStr.Substring(1); } if (paramStr != "") { //1階層づつ処理する var tmp = paramStr.Split(new[] { '\\', '/' }, StringSplitOptions.RemoveEmptyEntries); if (tmp.Any(name => !Cwd1(name))) { _current = keepCurrent; _oneMount = keepOneMount; return(false); } } return(true); }
//ディレクトリ変更(変更の階層は1つのみ) private bool Cwd1(string name) { const bool isDir = true; if (_oneMount == null) { var path = CreatePath(_current, name, isDir); //矛盾が発生した場合は、nullとなる if (path != null) { //ホームディレクトリ階層下のディレクトリへの移動のみ許可 if (path.IndexOf(_homeDir) == 0) { //ホームディレクトリより上位のディレクトリへの移動は許可しない if (_homeDir.Length <= path.Length) { //ディレクトリの存在確認 if (Directory.Exists(path)) { //if (Directory.Exists(path)) { _current = path; return(true); } } } } //仮想フォルダへの移動を確認する foreach (var a in _listMount) { if (a.IsToFolder(_current)) { if (string.Format("{0}{1}\\", _current, a.Name) == path) { _current = a.FromFolder + "\\"; _oneMount = a; return(true); } } } } else { //パラメータから新しいディレクトリ名を生成する var path = CreatePath(_current, name, isDir); //矛盾が発生した場合は、nullとなる if (path != null) { //仮想フォルダのマウント先の階層下のディレクトリへの移動のみ許可 if (path.IndexOf(_oneMount.FromFolder) == 0) { //仮想フォルダのマウント先より上位のディレクトリへの移動は許可しない if (_oneMount.FromFolder.Length <= path.Length) { //ディレクトリの存在確認 if (Directory.Exists(path)) { _current = path; return(true); } } } } //仮想フォルダ外への移動の場合 //マウント位置を追加して、仮想pathを生成する var s = _current.Substring(_oneMount.FromFolder.Length); path = string.Format("{0}\\{1}{2}", _oneMount.ToFolder, _oneMount.Name, s); path = CreatePath(path, name, isDir); //矛盾が発生した場合は、nullとなる if (path != null) { //ホームディレクトリ階層下のディレクトリへの移動のみ許可 if (path.IndexOf(_homeDir) == 0) { //ホームディレクトリより上位のディレクトリへの移動は許可しない if (_homeDir.Length <= path.Length) { //ディレクトリの存在確認 if (Directory.Exists(path)) { _oneMount = null; _current = path; return(true); } } } } } return(false); }
//ディレクトリ変更(変更の階層は1つのみ) private bool Cwd1(string name) { const bool isDir = true; if (_oneMount == null){ var path = CreatePath(_current, name, isDir); //矛盾が発生した場合は、nullとなる if (path != null){ //ホームディレクトリ階層下のディレクトリへの移動のみ許可 if (path.IndexOf(_homeDir) == 0){ //ホームディレクトリより上位のディレクトリへの移動は許可しない if (_homeDir.Length <= path.Length){ //ディレクトリの存在確認 if (Directory.Exists(path)){ //if (Directory.Exists(path)) { _current = path; return true; } } } } //仮想フォルダへの移動を確認する foreach (var a in _listMount){ if (a.IsToFolder(_current)){ if (string.Format("{0}{1}\\", _current, a.Name) == path){ _current = a.FromFolder + "\\"; _oneMount = a; return true; } } } } else{ //パラメータから新しいディレクトリ名を生成する var path = CreatePath(_current, name, isDir); //矛盾が発生した場合は、nullとなる if (path != null){ //仮想フォルダのマウント先の階層下のディレクトリへの移動のみ許可 if (path.IndexOf(_oneMount.FromFolder) == 0){ //仮想フォルダのマウント先より上位のディレクトリへの移動は許可しない if (_oneMount.FromFolder.Length <= path.Length){ //ディレクトリの存在確認 if (Directory.Exists(path)){ _current = path; return true; } } } } //仮想フォルダ外への移動の場合 //マウント位置を追加して、仮想pathを生成する var s = _current.Substring(_oneMount.FromFolder.Length); path = string.Format("{0}\\{1}{2}", _oneMount.ToFolder, _oneMount.Name, s); path = CreatePath(path, name, isDir); //矛盾が発生した場合は、nullとなる if (path != null){ //ホームディレクトリ階層下のディレクトリへの移動のみ許可 if (path.IndexOf(_homeDir) == 0){ //ホームディレクトリより上位のディレクトリへの移動は許可しない if (_homeDir.Length <= path.Length){ //ディレクトリの存在確認 if (Directory.Exists(path)){ _oneMount = null; _current = path; return true; } } } } } return false; }
//ディレクトリ変更 public bool Cwd(string paramStr) { //失敗した場合、移動しない var keepCurrent = _current; var keepOneMount = _oneMount; //絶対パス指定の場合、いったんルートまで戻る if (paramStr[0] == '/'){ if (!Cwd1("/")){ _current = keepCurrent; _oneMount = keepOneMount; return false; } paramStr = paramStr.Substring(1); } if (paramStr != ""){ //1階層づつ処理する var tmp = paramStr.Split(new[]{'\\', '/'},StringSplitOptions.RemoveEmptyEntries); if (tmp.Any(name => !Cwd1(name))){ _current = keepCurrent; _oneMount = keepOneMount; return false; } } return true; }