diff --git a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/DirectoryNode.cs b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/DirectoryNode.cs index 20533abafb..194886a2a3 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/DirectoryNode.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/DirectoryNode.cs @@ -474,6 +474,9 @@ namespace ICSharpCode.SharpDevelop.Project if (!FileService.CheckFileName(newName)) { return; } + if (!FileService.CheckDirectoryName(newName)) { + return; + } string oldText = Text; Text = newName; if (Directory != null) { diff --git a/src/Main/Base/Project/Src/Services/File/FileService.cs b/src/Main/Base/Project/Src/Services/File/FileService.cs index 12b28c3f94..aa2b538409 100644 --- a/src/Main/Base/Project/Src/Services/File/FileService.cs +++ b/src/Main/Base/Project/Src/Services/File/FileService.cs @@ -50,6 +50,18 @@ namespace ICSharpCode.Core return false; } + /// + /// Checks that a single directory name is valid. + /// + /// A single directory name not the full path + public static bool CheckDirectoryName(string name) + { + if (FileUtility.IsValidDirectoryName(name)) + return true; + MessageService.ShowMessage(StringParser.Parse("${res:ICSharpCode.SharpDevelop.Commands.SaveFile.InvalidFileNameError}", new string[,] {{"FileName", name}})); + return false; + } + class LoadFileWrapper { IDisplayBinding binding; diff --git a/src/Main/Core/Project/Src/Services/FileUtility/FileUtility.cs b/src/Main/Core/Project/Src/Services/FileUtility/FileUtility.cs index 6a7f7bd368..9732e213e7 100644 --- a/src/Main/Core/Project/Src/Services/FileUtility/FileUtility.cs +++ b/src/Main/Core/Project/Src/Services/FileUtility/FileUtility.cs @@ -315,6 +315,22 @@ namespace ICSharpCode.Core Char.IsDigit(ch)); } + /// + /// Checks that a single directory name (not the full path) is valid. + /// + public static bool IsValidDirectoryName(string name) + { + if (!IsValidFileName(name)) { + return false; + } + if (name.IndexOfAny(new char[]{Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar}) >= 0) { + return false; + } + if (name.Trim(' ').Length == 0) { + return false; + } + return true; + } public static bool TestFileExists(string filename) { diff --git a/src/Main/Core/Test/ICSharpCode.Core.Tests.csproj b/src/Main/Core/Test/ICSharpCode.Core.Tests.csproj index 02cc4cbed9..450dae3f57 100644 --- a/src/Main/Core/Test/ICSharpCode.Core.Tests.csproj +++ b/src/Main/Core/Test/ICSharpCode.Core.Tests.csproj @@ -48,6 +48,7 @@ + diff --git a/src/Main/Core/Test/InvalidDirectoryNameTests.cs b/src/Main/Core/Test/InvalidDirectoryNameTests.cs new file mode 100644 index 0000000000..7855adc944 --- /dev/null +++ b/src/Main/Core/Test/InvalidDirectoryNameTests.cs @@ -0,0 +1,40 @@ +// +// +// +// +// $Revision$ +// + +using NUnit.Framework; +using System; + +namespace ICSharpCode.Core.Tests +{ + [TestFixture] + public class InvalidDirectoryNameTests + { + [Test] + public void ContainsBackslash() + { + Assert.IsFalse(FileUtility.IsValidDirectoryName(@"project\test")); + } + + [Test] + public void ContainsForwardSlash() + { + Assert.IsFalse(FileUtility.IsValidDirectoryName(@"project/test")); + } + + [Test] + public void IsPRN() + { + Assert.IsFalse(FileUtility.IsValidDirectoryName("PRN")); + } + + [Test] + public void IsEmptySpace() + { + Assert.IsFalse(FileUtility.IsValidDirectoryName(" ")); + } + } +}