1. No utilizar nombres de variables cómo
path que puedan entrar en conflicto con nombres de namespaces, classes (
System.IO.Path) u otros miembros built-in.
2. Referencia el texto del control
TextBox1, ya que lo usas más de una vez.
3. También deberías comprobar, antes de intentar crear el directorio, si la ruta/nombre de directorio contiene caracteres ilegales, con la función
System.IO.Path.GetInvalidFileNameChars o
System.IO.Path.GetInvalidPathChars dependiendo de si es un nombre de carpeta o una ruta completa.
4. La variable
di no la usas para nada, dale uso para evitar la siguiente llamada a
Directory.GetCreationTime.
Un ejemplo:
Dim text As String = TextBox1.Text
Dim dirPath As String = Path.Combine("C:\", text)
If String.IsNullOrEmpty(text) Then
MessageBox.Show("Debe asignar un nombre de directorio.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Stop)
ElseIf Path.GetInvalidFileNameChars.Any(Function(c) text.Contains(c)) Then
MessageBox.Show("El nombre de directorio contiene caracteres ilegales.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Stop)
ElseIf Directory.Exists(dirPath) Then
MessageBox.Show("El directorio ya existe.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Stop)
Else
Dim di As DirectoryInfo = Directory.CreateDirectory(dirPath)
MessageBox.Show(String.Format("Se ha creado una carpeta: {0}", di.CreationTime.ToString),
"Éxito", MessageBoxButtons.OK, MessageBoxIcon.Information)
End If
Traducción online a C#:
string text = TextBox1.Text;
string dirPath = Path.Combine("C:\\", text);
if (string.IsNullOrEmpty(text)) {
MessageBox.Show("Debe asignar un nombre de directorio.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Stop);
} else if (Path.GetInvalidFileNameChars.Any(c => text.Contains(c)) {
MessageBox.Show("El nombre de directorio contiene caracteres ilegales.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Stop);
} else if (Directory.Exists(dirPath)) {
MessageBox.Show("El directorio ya existe.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Stop);
} else {
DirectoryInfo di = Directory.CreateDirectory(dirPath);
MessageBox.Show(string.Format("Se ha creado una carpeta: {0}", di.CreationTime.ToString), "Éxito", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
//=======================================================
//Service provided by Telerik (www.telerik.com)
//=======================================================
De todas formas para tratar temas de validación de datos introducidos en los campos de un control, lo apto graficamente hablando sería utilizar un proveedor de errores (ErrorProvider).
Ejemplo en VB.Net (el de la imagen GIF)
Imports System.IO
Public NotInheritable Class Form1 : Inherits Form
Private ReadOnly Property DirectoryPath As String
Get
Return String.Format("C:\{0}", TextBox1.Text) ' o Path.Combine("C:\", TextBox1.Text)
End Get
End Property
Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) _
Handles TextBox1.TextChanged, TextBox1.Enter
Dim tb As TextBox = DirectCast(sender, TextBox)
If String.IsNullOrEmpty(tb.Text) Then
Me.ErrorProvider1.SetError(tb, "Debe asignar un nombre de directorio.")
ElseIf Path.GetInvalidFileNameChars.Any(Function(c) tb.Text.Contains(c)) Then
Me.ErrorProvider1.SetError(tb, "El nombre de directorio contiene caracteres ilegales.")
ElseIf Directory.Exists(Me.DirectoryPath) Then
Me.ErrorProvider1.SetError(tb, "El directorio ya existe.")
Else
' Eliminar error.
Me.ErrorProvider1.SetError(tb, String.Empty)
End If
Label1.Text = Me.ErrorProvider1.GetError(tb)
Button1.Enabled = String.IsNullOrEmpty(Label1.Text)
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim di As DirectoryInfo = Directory.CreateDirectory(Me.DirectoryPath)
MessageBox.Show(String.Format("Se ha creado una carpeta: {0}", di.CreationTime.ToString),
"Éxito", MessageBoxButtons.OK, MessageBoxIcon.Information)
End Sub
End Class
Traducción online a C#:
using Microsoft.VisualBasic;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.IO;
public sealed class Form1 : Form
{
private string DirectoryPath {
// o Path.Combine("C:\", TextBox1.Text)
get { return string.Format("C:\\{0}", TextBox1.Text); }
}
private void TextBox1_TextChanged(object sender, EventArgs e)
{
TextBox tb = (TextBox)sender;
if (string.IsNullOrEmpty(tb.Text)) {
this.ErrorProvider1.SetError(tb, "Debe asignar un nombre de directorio.");
} else if (Path.GetInvalidFileNameChars.Any(c => tb.Text.Contains(c))) {
this.ErrorProvider1.SetError(tb, "El nombre de directorio contiene caracteres ilegales.");
} else if (Directory.Exists(this.DirectoryPath)) {
this.ErrorProvider1.SetError(tb, "El directorio ya existe.");
} else {
// Eliminar error.
this.ErrorProvider1.SetError(tb, string.Empty);
}
Label1.Text = this.ErrorProvider1.GetError(tb);
Button1.Enabled = string.IsNullOrEmpty(Label1.Text);
}
private void Button1_Click(object sender, EventArgs e)
{
DirectoryInfo di = Directory.CreateDirectory(this.DirectoryPath);
MessageBox.Show(string.Format("Se ha creado una carpeta: {0}", di.CreationTime.ToString), "Éxito", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
//=======================================================
//Service provided by Telerik (www.telerik.com)
//=======================================================