Lỗi in ra số ngẫu nhiên trong C#

Mình đang học về winform ở phần control pictrual hiện ảnh lên winform . Trong máy mình có các ảnh sau : “1.jpg , 2.jpg , 3.jpg , 4.jpg và 5.jpg” mình sử dụng hàm random để sinh ra các số từ 1-> 5 sau đó chuyền vào địa chỉ tương đối . Nhưng khi chạy chương trình thành công thì khi nhấn vào nút button để thay đổi ảnh một vài lần thi gập lỗi , mình đọc thì thấy ghi là không có ảnh trên máy .Hi vọng các bạn sửa lỗi giúp mình . Cảm ơn !.

namespace OOP_WF_PhanSo
{
    public partial class Form2 : Form
    {
        string path = "";
        Random rand = new Random();
        int sorand = 0;
        public Form2()
        {
            InitializeComponent();
        }

        private void Form2_Load(object sender, EventArgs e)
        {
            path = Application.StartupPath + "\\demo_control_winform_pic\\";
            picAnh.Image = Image.FromFile(path + "3.jpg");
        }

        private void btnChon_Click(object sender, EventArgs e)
        {
            try
            {
                int so = 1;
                // sinh ngau nhien so
                sorand = rand.Next(1, 6);
                while (sorand == so)
                {
                    sorand = rand.Next(1, 6);
                }
                so = sorand;
                // lay anh tu may

                // dau anh vao pictr
                picAnh.Image = Image.FromFile(path + so + ".jpg");
            }
            catch (Exception ex)
            {
                MessageBox.Show("Khong ton tai anh tren may cua ban !");
            }

        }
        
    }
}

không có ảnh trên máy là bạn tự ghi ra mà, chứ có phải là lỗi đó thật đâu
sao bạn không coi message trong exception nó ghi gì mà bạn lại tự thông báo như thế

1 Like

Screenshot 2024-11-18 120557

Đây là ảnh mình chụp lại , khi in ra lỗi ở phần try , catch . Hinh như đây là lỗi ở hàm random , mình đã kiểm tra kỉ thì không phát hiện nó gặp lỗi ở phần đường dẫn. Nên mình đoán là lỗi ở hàm random khi sinh ra nhiều số ngẫu nhiên liên tục khi mình nhấn button liên tục có vấn đề thì gặp lỗi dẫn đến sai đường dẫn => không tìm thấy ảnh trên máy . Mình cũng không biết cách để fix lỗi này .

Tại sao lại phải đoán? Tại sao không đặt break point ngay chỗ exception kia xem nó sinh ra file ảnh nào, đường dẫn như nào, check thử xem có ảnh đó trên máy chưa (nhớ check kỹ đường dẫn)…

2 Likes

Ok mình cảm ơn bạn đã bình luận để mình kiểm tra lại ?

Mình thì không rõ vấn đề ở đây là gì nhưng nhìn thấy cái path của bạn là quá tiềm ẩn nguy hiểm.

Lẽ ra dự án bạn chỉ cần chứa trong thư mục C:\DuAn là đủ, hình ảnh cùng lắm là C:\DuAn\Winform\PIC. Mình không rõ Microsoft có làm gì mới với Windows 10, 11 hay không (vì mình không dùng Windows nào sau Windows XP).

Hồi đó 2009-2012 mình đi triển khai dự án, có lúc phải tự build phần mềm từ các bợm developer, bợm nào dùng path > 7 cấp là mình về dọa cho mấy bợm tự đi mà triển khai. Lý do: Windows Server thuở đó bỏ qua hoặc gặp rắc rối vớii đường dẫn quá 7 cấp.

Ở đây, bạn đang dùng đến > chục cấp => e rằng lỗi nảy sinh. Lại có thư mục đặt tiếng Việt có dấu nữa thì thua.

4 Likes

The random generator is the most used API and is “almost” error-free, so your GUESSING is very funny for a developer. Instead of looking for the right path (locally) or the right way to access a file in the cloud (OneDrive), you guess like a witch guessing the future with a crystal ball

witch

3 Likes

ok mình cảm ơn bạn đã bình luận để mình xem lại !. Nếu có gì không ổn hy vọng bạn cho ý kiến để cùng nhau phát triển ?

Cảm ơn bạn đã mình luận !.

The file remains locked until the Image is disposed.

1 “feature” tâm thần của Image.FromFile: đọc ảnh xong vẫn lock (ko cho ai khác đọc) file ảnh đã đọc??? Vậy ở đây nếu số ngẫu nhiên sinh ra trùng với ảnh đã load thì vì file ảnh đó bị locked nên image mới ko đọc được -> báo lỗi file ko tồn tại

gg cách sửa thì ra trang này: https://stackoverflow.com/questions/788335/why-does-image-fromfile-keep-a-file-handle-open-sometimes

thử sửa 2 dòng Image.FromFile thành Image.FromStream(new MemoryStream(File.ReadAllBytes(fileName)))

2 Likes

Thank you các bạn đã thảo luận đóng góp ý kiến mình đã tìm ra lỗi . Thì lỗi nằm ở đuôi file số 4 mà mình download về máy không phải đuôi .jpg mà là .png mình download một loạt về để demo nên nhầm lẫn không để ý đến đuôi file đã tải . Vì vậy khi chạy random đến số 4.png thì không tìm thấy và thông báo.

2 Likes

Cảm ơn bạn đã thảo luận học tập mình đã tìm ra lỗi . Chúc bạn một ngày vui vẽ .

ơ vậy là cái file bị lock đó vẫn đọc được à :hocho: vậy chắc là read lock, ko cho write/modify thôi à :hocho: nếu vậy thì chắc feature này ko tâm thần :flushed:

3 Likes

See? Checking for the CORRECT path (including file name) is the key to working with files. Don’t guess, just do the basic search for the problems, which are usually due to either an incorrect name or path, or the non-existence of the file.

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?