[Assuming you continue implementing your class' internals in the C-style, which may or may not be beneficial in terms of development and execution speed (depending on the whole project's design) but is generally not recommended in favor of std::string and friends.]
Turning
const char *filename;
into
char *filename;
will not make you happy with the strcpy, since you actually need some memory for a copy of your string :)
For the manual memory management code part, please see Tadeusz Kopec's answer, which seems to have it all right.
Also, keep in mind that there is a difference between
const char *filename; // "filename" points to "const char"
// and is not const itself
char const *filename; // semantically the same as above
and
char * const filename; // "filename" is const and points to "char",
// which is not const
In the first case, you can make filename point to any other const char string, in the second, you can only change that string "in-place" (so keeping the filename value the same, as it points to the same memory location). Of course one can combine these two (or none of them) if needed.
P.S. If you name your member function's parameter _filename only to avoid naming collision with the member variable filename, you can just prefix it with this (and get rid of the underscore):
void MyClass::func (const char *filename)
{
...
this.filename = copy;
}