【问题标题】:My StreamWriter isn't giving an error, but isn't writing to the .txt file?我的 StreamWriter 没有给出错误,但没有写入 .txt 文件?
【发布时间】:2014-10-16 06:34:18
【问题描述】:

感谢您的所有建议!

我真的很困惑为什么这仍然不起作用,“Customers.txt”只是包含在解决方案中,它可以用 StreamReader 打开它,这是我的完整代码:/

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace CustomerDetails
{
class Program
{
    class userDetails
    {
        public static List<string> firstName;
        public static List<string> lastName;
        public static List<string> telNumber;
        public static List<string> birthDate;
        public static List<string> postCode;
        public static string userDecision;
    }

    static void Main(string[] args)
    {
        int x = 1;
        userDetails.firstName = new List<string>();
        userDetails.lastName = new List<string>();
        userDetails.birthDate = new List<string>();
        userDetails.telNumber = new List<string>();
        userDetails.postCode = new List<string>();

        while (x == 1)
        {
            Console.WriteLine("------------------------------");
            Console.WriteLine("       CUSTOMER DATABASE      ");
            Console.WriteLine("------------------------------");
            Console.WriteLine("1.) Add Customer(s)");
            Console.WriteLine("2.) List Customers");
            Console.WriteLine("3.) Exit");
            Console.WriteLine("------------------------------");
            userDetails.userDecision = Console.ReadLine().Trim().ToUpper().Replace(" ", "");
            if (userDetails.userDecision == "1" ||
                userDetails.userDecision == "2" ||
                userDetails.userDecision == "3")
                break;
            else
                Console.Clear();
        }

        if (userDetails.userDecision == "3") { Environment.Exit(0); }

        Console.Clear();
        Console.WriteLine("------------------------------");
        Console.WriteLine("       CUSTOMER DATABASE      ");
        Console.WriteLine("------------------------------");

        if (userDetails.userDecision == "1")
        {
            int y = 0;

            while (y > -1)
            {
                string input;
                Console.Clear();
                Console.WriteLine("------------------------------");
                Console.WriteLine("         NEW CUSTOMER         ");
                Console.WriteLine("------------------------------");
                Console.Write("First Name: ");
                userDetails.firstName.Add(Console.ReadLine());
                Console.Write(" Last Name: ");
                userDetails.lastName.Add(Console.ReadLine());
                Console.Write("       DOB: ");
                userDetails.birthDate.Add(Console.ReadLine());
                Console.Write("Tel Number: ");
                userDetails.telNumber.Add(Console.ReadLine());
                Console.Write(" Post Code: ");
                userDetails.postCode.Add(Console.ReadLine());
                Console.WriteLine("------------------------------");
                int e = 0;
                while (e == 0)
                {
                    Console.Write("Add Another? Y/N:");
                    userDetails.userDecision = Console.ReadLine().ToUpper();
                    if (userDetails.userDecision == "Y" || userDetails.userDecision == "N")
                        e = 1;
                }
                if (userDetails.userDecision == "N")
                {
                    break;
                }
            }

            StreamWriter fileWriter = new StreamWriter(File.Open("Customers.txt", FileMode.Append));

            int v = 0;

            foreach (string element in userDetails.firstName)
            {
                fileWriter.WriteLine("/-----------\\");
                fileWriter.WriteLine(userDetails.firstName[v]);
                fileWriter.WriteLine(userDetails.lastName[v]);
                fileWriter.WriteLine(userDetails.postCode[v]);
                fileWriter.WriteLine(userDetails.birthDate[v]);
                fileWriter.WriteLine(userDetails.telNumber[v]);
                fileWriter.WriteLine("\\-----------/");
                v++;
                Console.WriteLine("DOING.");
            }
            fileWriter.Dispose();
            fileWriter.Close();
            Console.WriteLine("DONE.");
            Console.ReadLine();
        }
        // LIST CUSTOMER DETAILS

        //else if (userDetails.userDecision == "2")
        //{
        //    StreamReader fileReader = new StreamReader("Customers.txt");
        //    string currentLine = "";

        //    while (currentLine != null)
        //    {
        //        currentLine = fileReader.ReadLine();

        //        if (currentLine != null) {
        //            if (currentLine != "/-----------\\") {
        //                if(currentLine == "\\-----------/")
        //                    Console.WriteLine();
        //                else
        //                Console.WriteLine(currentLine); } }
        //    }
        //    fileReader.Close();

        //}
        //Console.ReadLine();
    }
}
}

【问题讨论】:

  • 您确定要重复循环打开文件吗?你能不能想出一个简短但完整的例子,我们可以自己编译(例如,我不知道userDetails实际上是什么)
  • 您确定它没有写入您未查看的位置的文件吗?因为你没有指定路径,它会在应用程序认为是其当前目录的任何地方打开文件(不一定是它运行的目录)。
  • 无关:您的 userDetails 似乎是一个包含多个列表的对象。看起来更好的结构化数据的方法是拥有一个具有所需属性(firstNamelastName 等)的 UserDetail 类作为单个值,然后让 userDetails 成为一个包含对象的单个列表类型为UserDetail
  • 顺便说一句:@ErikFunkenbusch 是对的。我刚刚复制了你的代码,它可以工作。但它会写入应用程序“当前目录”中的Customer.txt。最有可能在项目的DebugRelease 文件夹中。

标签: c# .net visual-studio streamwriter


【解决方案1】:

您打开文件的次数与循环运行的次数一样多。

你需要打开文件然后输入你的循环代码,然后确保它关闭。

StreamWriter file= new StreamWriter(File.Open("fileName.txt", FileMode.CreateNew));

foreach (string element in userDetails.firstName)
{
   file.WriteLine("testing 1 10 11");

}

file.Close();
file.Dispose();

似乎using 会为你关闭文件,但我仍然更喜欢file.Close()file.Dispose(),直到我阅读更多关于using 的内容。

【讨论】:

  • Using 不自动处理对象?
  • using 处理对象,但它是否也会为您关闭文件?
  • 是的。 Close() 只是重定向到 Dispose()
  • 没错,刚刚发现。 stackoverflow.com/questions/707336/…
【解决方案2】:

改变

using (StreamWriter fileWriter = new StreamWriter("Customers.txt"))

行到

using (StreamWriter fileWriter = new StreamWriter(@"C:\Customers.txt"))

如果您在c:\ 上看到一个文件,那么问题是该文件正在写入但不是您期望的位置。可执行文件旁边是此类代码的常见位置,但不是唯一一个。

【讨论】:

  • 推荐一个一般可写的路径会更好——比如他们自己的用户目录; C 驱动器的根需要管理员/UAC 权限,它们可能不会在其下运行。
  • true...但是你告诉我他们系统上可写路径的文字? :) 不使用某些框架函数来确定桌面/文档,我认为这会使实际问题变得模糊。
  • 是的,但是“在 C 盘上找不到文件,现在它抛出异常”为 OP 诊断引入了一个新问题。
猜你喜欢
  • 2014-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-04
  • 1970-01-01
  • 1970-01-01
  • 2014-05-07
  • 1970-01-01
相关资源
最近更新 更多