Windows Forms C#实现文件非覆盖保存,避免原有数据被删除
解决Windows Forms保存用户名密码不被清空的问题
问题根源
你的代码存在三个核心问题导致已有数据被清空:
- StreamWriter默认覆盖文件:实例化
StreamWriter时,默认会直接清空目标文件内容,哪怕后续没有写入操作,文件也已经被清空。 - 局部变量count无效:
count是按钮点击方法内的局部变量,每次点击都会重置为0,重启程序后完全失效,无法控制写入次数。 - 判断逻辑时机错误:在创建
StreamWriter之后才判断文件长度,此时文件已经被清空,导致判断条件永远为真,每次点击都会重新写入覆盖旧数据。
修正后的代码
private void btn1_Click(object sender, EventArgs e) { // 提取文件路径为变量,提升可读性 string nameFilePath = @"C:\Users\skerd\AppData\Local\Temp\jvvhbbcp..txt"; string passwordFilePath = @"C:\Users\skerd\AppData\Local\Temp\x1pu0bds..txt"; // 先判断两个文件是否为空(或不存在) bool isNameFileEmpty = !File.Exists(nameFilePath) || new FileInfo(nameFilePath).Length == 0; bool isPasswordFileEmpty = !File.Exists(passwordFilePath) || new FileInfo(passwordFilePath).Length == 0; if (isNameFileEmpty && isPasswordFileEmpty) { // 使用using语句自动管理文件流,无需手动调用Close using (TextWriter nameWriter = new StreamWriter(nameFilePath, false)) { nameWriter.Write(txtB_1.Text); } using (TextWriter passwordWriter = new StreamWriter(passwordFilePath, false)) { passwordWriter.Write(txtB_2.Text); } Close(); } }
关键修改说明
- 提前判断文件状态:将文件存在性和长度检查放在创建
StreamWriter之前,避免提前清空文件。 - 使用using语句:自动处理文件流的关闭与资源释放,比手动调用
Close更可靠,能避免异常导致的文件未关闭问题。 - 移除无效变量:删除了无法实现控制逻辑的局部变量
count,简化代码。
如果需要支持后续修改用户名密码(而非仅首次写入),只需移除文件为空的判断,直接写入即可,但此时仍要注意StreamWriter的模式,默认的false参数会覆盖原有内容,若需追加则改为true。
内容的提问来源于stack exchange,提问作者Skerdi Velo
相关产品推荐
相关产品推荐

