You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF C#修改图片源报错,更新用户信息遇两类异常

问题解决思路与代码修正

一、解决“Empty file name is not legal”错误

这个错误是因为未修改图片时,你调用SavePic方法传入了空的源文件路径。需要在保存逻辑中先判断是否有新图片需要处理:

  1. 在addUserBtn的点击事件里,先检查用户是否选择了新图片(比如判断图片选择对话框返回的路径是否为空)。
  2. 只有存在有效图片路径时,才执行SavePic保存逻辑;否则直接复用数据库中已有的图片路径。

示例代码片段:

private void addUserBtn_Click(object sender, RoutedEventArgs e)
{
    var selectedUser = dataGrid.SelectedItem as User;
    // newImagePath是用户选择的新图片路径,未选择则为空
    bool isImageChanged = !string.IsNullOrEmpty(newImagePath);

    if (isImageChanged)
    {
        string savedPath = SavePic(newImagePath);
        selectedUser.Image = savedPath;
    }
    // 未修改图片时,保留原Image字段值,不执行图片保存

    // 保存其他字段到数据库
    dbContext.Users.Update(selectedUser);
    dbContext.SaveChanges();
}

二、解决“文件被其他进程占用”错误

这个问题通常是Image控件未释放对原图片文件的占用,或保存图片时流未正确关闭。可以通过以下两种方式解决:

方式1:加载图片时用流释放资源

在Update菜单点击事件中,加载数据库中的图片路径时,使用FileStream并设置缓存选项,确保加载后释放文件:

private void UpdateMenuItem_Click(object sender, RoutedEventArgs e)
{
    var selectedUser = dataGrid.SelectedItem as User;
    if (selectedUser == null) return;

    if (!string.IsNullOrEmpty(selectedUser.Image))
    {
        using (var fs = new FileStream(selectedUser.Image, FileMode.Open, FileAccess.Read))
        {
            var bitmap = new BitmapImage();
            bitmap.BeginInit();
            bitmap.CacheOption = BitmapCacheOption.OnLoad; // 关键:加载完成后释放文件锁
            bitmap.StreamSource = fs;
            bitmap.EndInit();
            userImageControl.Source = bitmap;
        }
    }
    else
    {
        // 设置项目内默认图片
        userImageControl.Source = new BitmapImage(new Uri("pack://application:,,,/YourProjectName;component/Images/default.png"));
    }

    // 填充其他TextBox字段
    nameTextBox.Text = selectedUser.Name;
    userNameTextBox.Text = selectedUser.UserName;
}

方式2:修改SavePic方法避免文件占用

用流复制替代File.Copy,同时提前判断空路径:

private string SavePic(string sourcePath)
{
    if (string.IsNullOrEmpty(sourcePath))
        return string.Empty;

    string targetDir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "UserImages");
    Directory.CreateDirectory(targetDir); // 确保目标目录存在

    string fileName = Path.GetFileName(sourcePath);
    string targetPath = Path.Combine(targetDir, fileName);

    // 用流复制,避免File.Copy的文件锁定问题
    using (var sourceStream = new FileStream(sourcePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
    using (var targetStream = new FileStream(targetPath, FileMode.Create, FileAccess.Write))
    {
        sourceStream.CopyTo(targetStream);
    }

    return targetPath;
}

三、额外注意事项

  • 默认图片使用项目资源路径(pack://application:,,,/...),而非本地文件路径,避免不必要的文件占用。
  • 用户取消图片选择时,要将newImagePath重置为空,避免传入无效路径触发错误。

内容的提问来源于stack exchange,提问作者Mohammad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 14:15:45