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(" "));
+ }
+ }
+}